在Thread.join()执行

时间:2017-04-07 18:54:17

标签: java android multithreading

我遇到的问题是,杀死线程的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})

那么在线程执行后我该怎么做才能加载内容?

1 个答案:

答案 0 :(得分:3)

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

没有办法直接杀死一个线程,因为它不可能安全地这样做。从外部杀死一个线程的方法是中断它,并让线程检查它是否经常被中断(),如果是这样就自杀了。从内部杀死线程的方法是从runnable的run方法返回。

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