我正在学习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!");
    }
}

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

这样做的目的是什么?因为我试着 comments 它,什么都没有改变.

推荐答案

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

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

Java相关问答推荐

如何用javac编译Java类,即使对像java.lang.*这样的基本类也没有任何依赖关系?

将Nimbus设置为计算机上运行的所有Java应用程序的默认外观

替换com. sun. jndi. dns. DnsContextFactory Wildfly23 JDK 17

为什么在枚举中分支预测比函数调用快?

错误:在Liferay7.4中找不到符号导入com.liferay.portal.kernel.uuid.PortalUUID;";

如何创建同一类的另一个对象,该对象位于变量中?

无法使用ApacheSpark依赖项构建JavaFX应用程序

如何仅使用键/ID的一部分(组合)高效地返回映射值?

Spring-Boot Kafka应用程序到GraalVM本机映像-找不到org.apache.kafka.streams.processor.internals.DefaultKafkaClientSupplier

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

如何创建模块信息类文件并将其添加到JAR中?

在JDK Flight Recorder中只记录单个线程

插入中的JOOQ序列,设置为VS值

AWS Java SDK v2.x中没有setObjectAcl方法

将java.util.Date(01.01.0001)转换为java.time.LocalDate将返回29.12.0000

如何使用WebEnvironment.RANDOM_PORT获得第二个随机端口?

Java HashMap保留所有时间复杂性

在Java中使用StorageReference将数据从Firebase存储添加到数组列表

为什么使用lo索引来解决二进制搜索问题不同于使用hi索引?

如何使用java区分以下结果