代码之家  ›  专栏  ›  技术社区  ›  user22844207

线程Java中interrupt()之后调用join()

  •  1
  • user22844207  · 技术社区  · 10 月前

    我正在学习Thread Java,并遵循 official docs 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() 之后 中断() ?

    这样做的目的是什么?因为我试图对此发表评论,所以一切都没有改变。

    1 回复  |  直到 10 月前
        1
  •  3
  •   matt    10 月前

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

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