浅谈线程Join()的用法

xiaoxiao2021-02-28  92

new Thread(new Runnable() { public void run() { } }); 相信大家对这段代码很熟悉,在进行异步操作的时候,会经常用到它。 假如有两个线程同时执行的话,分别处理一段输出的逻辑,代码如下: public static void main(String[] args) { final Thread A = new Thread(new Runnable() { public void run() { printTest("A"); } }); Thread B = new Thread(new Runnable() { public void run() { printTest("B"); } }); A.start(); B.start(); } public static void printTest(String threadName){ int count = 0; while(count < 5){ count++; System.out.println(threadName + ":" + count); } }

运行结果: 第一次运行 B==1 A==1 B==2 A==2 B==3 A==3 B==4 B==5 A==4 A==5 第二次运行 A==1 B==1 A==2 B==2 A==3 B==3 B==4 B==5 A==4 A==5 发现不是每次运行的结果顺序都不一样,这不是我们当时设计的初衷,我们想的是先执行完A再执行B的,但是这个结果不是我们想要的。这里主要是因为线程间是默认是没法保证哪个先执行的,所以两次的结果才出现不一致的情况。那么,有没有办法让A先执行完再执行B呢?答案当然是有了,这时候join就起到作用了,咱们在B线程里代码加上这么一句A.join()即可,修改后的代码如下:

public static void main(String[] args) { final Thread A = new Thread(new Runnable() { public void run() { printTest("A"); } }); Thread B = new Thread(new Runnable() { public void run() { try { A.join();//此处加入join,表示先执行完A线程后再执行此后面的语句 printTest("B"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); A.start(); B.start(); } public static void printTest(String threadName){ int count = 0; while(count < 5){ count++; System.out.println(threadName + ":" + count); } }

咱们再看下运行的结果如何,是否达到我们的目的: 第一次运行 A==1 A==2 A==3 A==4 A==5 B==1 B==2 B==3 B==4 B==5 第二次运行 A==1 A==2 A==3 A==4 A==5 B==1 B==2 B==3 B==4 B==5 哈哈,到这里知道join的用处了吧。

转载请注明原文地址: https://www.6miu.com/read-54154.html

最新回复(0)