Thread.join()保证执行顺序

时间:2016-01-09 19:34:49

标签: java multithreading java-threads

我已阅读Thread文档并查看了一些示例,但我无法让我的代码正常运行。我想保证以{t2,t3,t1的顺序执行Thread,并尝试使用join()方法执行此操作。

根据我的理解,join()将确保调用它的线程实例将一直运行直到被杀死,然后继续执行下一个Thread的执行。这是我的代码:

public class ThreadyKrueger extends Thread {

private Thread t;
private String threadName;

public ThreadyKrueger(String name) {
    this.threadName = name;
    System.out.println("Creating thead, \"" + this.threadName + "\"");
}
@Override
public void run() {
    try {
        System.out.println("Job being run by " + this.threadName);
        Thread.sleep(200);
    } catch (InterruptedException e) {
        System.out.println("Thread " + this.threadName + " interrupted!");
    }
    System.out.println(this.threadName + " exiting...");
}
@Override
public void start() {
    System.out.println("Starting " + this.threadName);
    if (t == null) {
        t = new Thread(this, this.threadName);
    }
    t.start();
}

}

public class ThreadMain {

public static void main(String[] args) throws InterruptedException {
    //ensure order is t2, t3, t1
    ThreadyKrueger t2 = new ThreadyKrueger("T2");
    ThreadyKrueger t3 = new ThreadyKrueger("T3");
    ThreadyKrueger t1 = new ThreadyKrueger("T1");        
    t2.start();
    t2.join();        
    t3.start();
    t3.join();
    t1.start();
}

每次输出的输出都有所不同,例如:

Creating thead, "T2"
Creating thead, "T3"
Creating thead, "T1"
Starting T2
Starting T3
Starting T1
Job being run by T2
Job being run by T3
Job being run by T1
T1 exiting...
T2 exiting...
T3 exiting...

显然T2在T3开始之前没有被杀死,依此类推。我缺少什么(除了复制/粘贴中丢失的一些缩进和括号)。谢谢。

3 个答案:

答案 0 :(得分:1)

您从另一个线程启动一个线程,但加入起始线程(ThreadyKrueger)。 ThreadyKrueger在启动内部线程后立即执行,然后执行run()方法..

使用Runnable代替Thread的子类,以避免此类问题。

另外,我没有看到在单独的线程中顺序运行任务的重点。我将创建一个Runnable的列表/队列,然后在循环中处理它。

答案 1 :(得分:1)

你在main中创建的线程按顺序正确执行,但是当每个线程都启动它们自己的线程时,它们以并发方式运行......没有必要创建这些"子线程" 。删除已覆盖的start方法。

答案 2 :(得分:1)

在main方法中,当您执行 t2.start 时,在执行 t.start();

更好的方法是删除 ThreadyKrueger 类中的start方法。