java Thread.join 未按预期工作

标签 java multithreading

我有以下类(class)

class ThreadDemo extends Thread {
    private Thread t;
    private String threadName;

    ThreadDemo( String name) {
        threadName = name;
    }

    public void run() {
        for(int i = 5; i > 0; i--) {
            System.out.println("Thread " +  threadName + " Counter   ---   "  + i );
        }

        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            System.out.println("Sleep issue");
        }

        System.out.println("Finishing run");

        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            System.out.println("Sleep issue");
        }
    }

    public void start () {
        t = new Thread (this, threadName);
        t.start ();
    }
}

测试如下

public class Main {
    public static void main(String[] args) {
        ThreadDemo T1 = new ThreadDemo( "Thread - 1 ");
        ThreadDemo T2 = new ThreadDemo( "Thread - 2 ");
        T1.start();
        T2.start();

        //Let's give some time for threads to run
        try {
            Thread.sleep(10);
        } catch (Exception e) {
            System.out.println("Main sleep issue");
        }

        try {
            T1.join();
            T2.join();
        } catch ( Exception e) {
            System.out.println("Interrupted");
        }

        System.out.println("Finishing main.");
    }
}

为什么我总是在输出中的“Finishing run”之前得到“Finishing main”,尽管我使用了 T1.join() 和 T2.join() 来等待它们完成?最初我认为这可能是由于缓冲区延迟造成的,所以我在 run() 末尾添加了 Thread.sleep(1000) 以给一些时间来打印“Finishing run”,但它没有帮助。我猜这是由于第一次出现 Thread.sleep(1000) (当我删除它时,它工作正常),但不知道为什么。

最佳答案

是因为这个:

public void start () {
    t = new Thread (this, threadName);
    t.start ();
}

因此,您的 ThreadDemo 实例实际上从未作为线程启动:打印 Finishing run 消息的线程是在该方法中创建的线程。该线程和 ThreadDemo 之间没有链接。

删除 start() 方法。

关于java Thread.join 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47443975/

相关文章:

java - Weblogic 是否支持未标记为可序列化的 session 对象的故障转移?

java - 年轻一代的垃圾收集问题

java - ThreadPoolExecutor中如何在线程间分配任务

c - 无法在线程内用 C 打印?

带有线程池的Java阶乘计算

C++11 函数局部静态常量对象的线程安全初始化

java - Android:单击时列表中的项目不会变成橙色?

java - 无法在同一个包中实例化公共(public)类

java - 截击发帖请求问题

java - Java 在 32 位机器上可以创建的线程数