在线程被中断后重新加入线程到主线程的重点是什么?

时间:2016-04-18 23:36:36

标签: java multithreading concurrency

我在Java教程oracle中看到了下面的代码。我只是想知道在线程被中断后重新加入主线程的重点是什么?

if(((System.currentTimeMillis() - startTime) > patience) && t.isAlive()){
    threadMessage("tired of waiting");
    t.interrupt();
    t.join();

}

我从if语句中删除了t.join(),所有内容似乎完全相同。那么为什么代码的编写方式呢?

public class SimpleThreads {


    static void threadMessage(String message){
        String threadName = Thread.currentThread().getName();
        System.out.format("%s: %s%n", threadName, message);
    }

    private static class MessageLoop implements Runnable {

        @Override 
        public void run (){
            String[] importantInfo = { "dog", "cat", "mice"};

            try {
                for(int i = 0; i < importantInfo.length; i++){
                    Thread.sleep(4000);
                    threadMessage(importantInfo[i]);
                }
            } catch (InterruptedException e){
                threadMessage("i wasn't done!");
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        long patience = 10000;

        threadMessage("starting MessageLoop thread");
        long startTime = System.currentTimeMillis();
        Thread t = new Thread(new MessageLoop());
        t.start();

        threadMessage("waiting for MessageLoop thread to finish");
        while(t.isAlive()){
            threadMessage("still waiting...");
            t.join(1000);

            if(((System.currentTimeMillis() - startTime) > patience) && t.isAlive()){
                threadMessage("tired of waiting");
                t.interrupt();
                t.join();

            }
        }
        threadMessage("finally");
    }


}

1 个答案:

答案 0 :(得分:2)

致电时

t.join(1000);

Java不会在1000毫秒内通知您希望它完成的相应线程。如果该线程正在阻塞IO或正在休眠,就像你的那样,它将继续这样做。

这里,教程演示了一个更清晰的关闭模式。他们首先interrupt线程,它将从sleep唤醒(如果它正在执行)并最终终止。然后他们致电join()等待终止。

他们可能省略了join但是,根据线程的类型(daemon?)及其目的,可能会使应用程序处于不可预测的状态。

重申中断是一项协作努力非常重要。如果你想要干净地终止线程,它必须公开(记录好)适当的中断模式。