Java 多线程 (PART VII) 使用join()方法保证线程的执行顺序

来源:互联网 发布:淘宝网天猫女装棉衣 编辑:程序博客网 时间:2024/06/05 15:14

谁先被调用?

示例代码:

package a;class JoinThread extends Thread{    @Override    public void run() {        for(int i=0;i<10;i++) {            System.out.println(this.currentThread().getName()+"  "+i);        }    }}public class Join1 {    public static void main(String[] args) {         JoinThread join1=new JoinThread();         JoinThread join2=new JoinThread();         JoinThread join3=new JoinThread();         JoinThread join4=new JoinThread();         JoinThread join5=new JoinThread();         join1.start();         join2.start();         join3.start();         join4.start();         join5.start();    }}

在这段代码中,一共有6个线程将会被JVM创建。
运行的结果却和我们start的顺序不一样,这是因为这些线程都在Runnable状态,他们都可以被调度,而且先调用谁是随机的。
于是

输出结果:

Thread-1  0Thread-3  0Thread-2  0Thread-0  0Thread-4  0Thread-4  1Thread-0  1Thread-2  1Thread-2  2Thread-2  3Thread-2  4Thread-2  5Thread-2  6Thread-2  7Thread-2  8Thread-2  9Thread-3  1Thread-3  2Thread-3  3Thread-3  4Thread-3  5Thread-3  6Thread-3  7Thread-3  8Thread-3  9Thread-1  1Thread-1  2Thread-1  3Thread-1  4Thread-1  5Thread-1  6Thread-1  7Thread-1  8Thread-1  9Thread-0  2Thread-0  3Thread-0  4Thread-0  5Thread-0  6Thread-0  7Thread-0  8Thread-0  9Thread-4  2Thread-4  3Thread-4  4Thread-4  5Thread-4  6Thread-4  7Thread-4  8Thread-4  9

可以看到输出的结果非常混乱。

如何保证输出顺序与Start的顺序一致

这里需要用到join()方法;

join()方法的作用:

启动另一个线程并且本线程进入阻塞状态,等到被启动的线程执行完成或者无法继续执行时,本线程再进入就绪状态,等待被调用。

示例代码:

public class Join1 {    public static void main(String[] args) {         JoinThread join1=new JoinThread();         JoinThread join2=new JoinThread();         JoinThread join3=new JoinThread();         JoinThread join4=new JoinThread();         JoinThread join5=new JoinThread();         try {             join1.start();             join1.join();        } catch (InterruptedException e) {            e.printStackTrace();        }         try {             join2.start();             join2.join();        } catch (InterruptedException e) {            e.printStackTrace();        }         try {             join3.start();             join3.join();        } catch (InterruptedException e) {            e.printStackTrace();        }         try {             join4.start();             join4.join();        } catch (InterruptedException e) {            e.printStackTrace();        }         try {             join5.start();             join5.join();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

这样便可以保证在一个线程运行完成之后才去启动另一个线程。
由此便可以保证输出的顺序就是代码里start的顺序。

输出结果:

Thread-0  0Thread-0  1Thread-0  2Thread-0  3Thread-0  4Thread-0  5Thread-0  6Thread-0  7Thread-0  8Thread-0  9Thread-1  0Thread-1  1Thread-1  2Thread-1  3Thread-1  4Thread-1  5Thread-1  6Thread-1  7Thread-1  8Thread-1  9Thread-2  0Thread-2  1Thread-2  2Thread-2  3Thread-2  4Thread-2  5Thread-2  6Thread-2  7Thread-2  8Thread-2  9Thread-3  0Thread-3  1Thread-3  2Thread-3  3Thread-3  4Thread-3  5Thread-3  6Thread-3  7Thread-3  8Thread-3  9Thread-4  0Thread-4  1Thread-4  2Thread-4  3Thread-4  4Thread-4  5Thread-4  6Thread-4  7Thread-4  8Thread-4  9
原创粉丝点击