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

23 篇文章 0 订阅
23 篇文章 1 订阅

谁先被调用?

示例代码:
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  0
Thread-3  0
Thread-2  0
Thread-0  0
Thread-4  0
Thread-4  1
Thread-0  1
Thread-2  1
Thread-2  2
Thread-2  3
Thread-2  4
Thread-2  5
Thread-2  6
Thread-2  7
Thread-2  8
Thread-2  9
Thread-3  1
Thread-3  2
Thread-3  3
Thread-3  4
Thread-3  5
Thread-3  6
Thread-3  7
Thread-3  8
Thread-3  9
Thread-1  1
Thread-1  2
Thread-1  3
Thread-1  4
Thread-1  5
Thread-1  6
Thread-1  7
Thread-1  8
Thread-1  9
Thread-0  2
Thread-0  3
Thread-0  4
Thread-0  5
Thread-0  6
Thread-0  7
Thread-0  8
Thread-0  9
Thread-4  2
Thread-4  3
Thread-4  4
Thread-4  5
Thread-4  6
Thread-4  7
Thread-4  8
Thread-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  0
Thread-0  1
Thread-0  2
Thread-0  3
Thread-0  4
Thread-0  5
Thread-0  6
Thread-0  7
Thread-0  8
Thread-0  9
Thread-1  0
Thread-1  1
Thread-1  2
Thread-1  3
Thread-1  4
Thread-1  5
Thread-1  6
Thread-1  7
Thread-1  8
Thread-1  9
Thread-2  0
Thread-2  1
Thread-2  2
Thread-2  3
Thread-2  4
Thread-2  5
Thread-2  6
Thread-2  7
Thread-2  8
Thread-2  9
Thread-3  0
Thread-3  1
Thread-3  2
Thread-3  3
Thread-3  4
Thread-3  5
Thread-3  6
Thread-3  7
Thread-3  8
Thread-3  9
Thread-4  0
Thread-4  1
Thread-4  2
Thread-4  3
Thread-4  4
Thread-4  5
Thread-4  6
Thread-4  7
Thread-4  8
Thread-4  9
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值