在 Thread Java 中的 interrupt() 之后调用 join()

call join() after interrupt() in Thread Java

提问人:user22844207 提问时间:11/10/2023 最后编辑:user22844207 更新时间:11/12/2023 访问量:46

问:

我正在学习 Thread Java,我按照官方文档 java 上的教程进行操作

此示例结合了各种方法:、 和 、join()sleep()interrupt()start()

public class SimpleThread {
    // Display a message, preceded by
    // the name of the current thread
    static void threadMessage(String message) {
        String threadName = Thread.currentThread().getName();
        System.out.format("%s: %s%n", threadName, message);
    }

    private static class MessageLoop implements Runnable {
        public void run() {
            String importantInfo[] = {
                    "Mares eat oats",
                    "Does eat oats",
                    "Little lambs eat ivy",
                    "A kid will eat ivy too"
            };

            try {
                for (int i = 0;
                     i < importantInfo.length;
                     i++) {
                    // Pause for 4 seconds
                    Thread.sleep(4000);
                    // Print a message
                    threadMessage(importantInfo[i]);
                }
            } catch (InterruptedException e) {
                threadMessage("I wasn't done!");
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        // Delay, in milliseconds before
        // we interrupt MessageLoop
        // thread (default 10s).
        long patience = 1000 * 10;

        threadMessage("Starting MessageLoop thread");
        long startTime = System.currentTimeMillis();

        Thread t = new Thread(new MessageLoop(), "MessageLoop");
        t.start();
        threadMessage("Waiting for MessageLoop thread to finish");

        while (t.isAlive()) {
            threadMessage("Still waiting...");
            t.join(16000);

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

                t.join();
            }
        }
        threadMessage("Finally!");
    }
}

为什么作者使用后?join()interrupt()

这样做的目的是什么?因为我试图评论它,所以没有任何变化。

java 线程

评论


答:

3赞 matt 11/10/2023 #1

在线程上调用 interrupt 会发出终止线程的信号,但不会强制终止。因此,线程可能仍在运行。调用 join 将强制调用线程等待,直到中断的线程完成,或者自身被中断。

在线程中,大部分等待是由 Thread.sleep() 引起的。调用 interrupt 时,当前或下一次休眠调用将以中断异常结束。这意味着被中断的工作线程将很快结束。在这种情况下,调用 join 可能不是必需的,因为线程终止得太快了。

评论

0赞 user22844207 11/10/2023
多谢。你解释得很清楚