2017-04-07 98 views
0

我遇到问题,即用于终止线程的join方法未执行在线程中启动的方法的其余部分。下面是一个代码示例:在Thread.join()执行后执行相同方法中的代码

private static Thread thread; 

public static void addMessage(final String s) { 
    thread = new Thread() { 
     @Override 
     public void run() { 
      String data = Message.send(s); 
      addMessageToContainer(data); 
     } 
    }; 
    thread.start(); 
} 

public static void addMessageToContainer(String data) { 
    //Do some stuff with the data 
    try { 
     thread.join(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    //This code here will not be executed. 
} 

所以通常情况下,我当然之前我所说的join函数执行代码。但是我必须在这个线程执行后加载一些带有内容的webview。所以,当我删除join,它将给我以下错误信息:

java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'Thread-9072'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {5ac9b39} called on null, FYI main Looper is Looper (main, tid 1) {5ac9b39}) 

所以我能做些什么的线程执行后加载的内容?

回答

3

加入并不杀死一个线程。加入等待,直到该线程自杀。因此,代码将在未来的某个时间执行 - 当该线程决定完成时。调用等待来自该线程的线程将导致它陷入死锁,从不做任何事情,但永远不会死。所以在上面你从线程本身调用它的情况下,它会永远挂起。

没有办法直接杀死一个线程,因为它不可能安全地这样做。从外部杀死线程的方法是中断线程,让线程每隔一段时间检查一次线程是否中断,如果是这样,就自己杀死线程。从内部杀死线程的方法是从可运行的run方法返回。

你的webview错误是完全不相关的。您只能触摸主线程的视图。不要在线程上使用webview做任何事情。

+0

return或'throw ...' –

+0

更正确的是:没有办法直接杀死一个线程,因为它不可能安全地这样做(除了在进程终止时操作系统执行它)。 – ThingyWotsit