java多线程 关于join 的问题

我想通过join让线程 a b c d顺序打印,但是现在是乱序打印

public class ExJoin extends Thread {

    Thread thread;

    public ExJoin(){

    }

    public ExJoin(Thread thread){
        this.thread  = thread;
    }

    @Override
    public void run() {
        try {
            if (thread != null){
                thread.join();
            }
            System.out.println(Thread.currentThread().getName()+"  is running");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Thread threadA = new ExJoin();
        threadA.setName("A");
        Thread threadB = new ExJoin(threadA);
        threadB.setName("B");
        Thread threadC = new ExJoin(threadB);
        threadC.setName("C");
        Thread threadD =  new ExJoin(threadC);
        threadD.setName("D");


        threadC.start();
        threadD.start();
        threadA.start();
        threadB.start();
    }
}
呼啦一阵风
浏览 466回答 3
3回答

HUX布斯

按照楼主的代码逻辑,join是无法做到有序的,因为A/B/C/D线程的启动运行依赖于CPU调度,如果线程B未启动线程C调用threadB.join方法是不会生效的。可以看看jdk内置的逻辑实现isAlive()为false时直接返回了。 public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }

慕盖茨4494581

在run方法中sleep(1000)确实会顺序出现。我猜测可能是指令重排序,前面的线程已经就绪,但是后面的线程对象还没有创建出来,所以出现了乱序。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java