这篇文章将为大家详细讲解有关Java中线程之间的通信是如何实现的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。
本文涉及到的知识点:thread.join (), object.wait (), object.notify (), CountdownLatch, CyclicBarrier, FutureTask,可调用等。
下面我从几个例子作为切入点来讲解下Java里有哪些方法来实现线程间通信。
- <李>如何让两个线程依次执行?李> <李>那如何让两个线程按照指定方式有序交叉运行呢?李> <李>四个线程A B C D,其中D要等到A B C全执行完毕后才执行,而且A B C是同步运行的李> <>李三个运动员各自准备,等到三个人都准备好后,再一起跑李> <李>子线程完成某件任务后,把得到的结果回传给主线程李>
<>强如何让两个线程依次执行吗? 强>
假设有两个线程,一个是线程,另一个是线程B,两个线程分别依次打印1 - 3三个数字即可。我们来看下代码:
私有静态孔隙demo1 () { 线程A=新线程(新Runnable () { @Override 公共空间run () { printNumber (“A"); } }); 线程B=新线程(新Runnable () { @Override 公共空间run () { printNumber (“B"); } }); A.start (); B.start (); }
其中的<代码> printNumber (String) 代码>实现如下,用来依次打印<代码> 1,2,3 代码>三个数字:
私有静态孔隙printNumber(字符串threadName) { int i=0; 虽然(我+ + & lt;3){ 尝试{ thread . sleep (100); }捕捉(InterruptedException e) { e.printStackTrace (); } system . out。println (threadName +“;打印:“;+ i); } }
这时我们得到的结果是:
B打印:1
打印:1
B打印:打印2
: 2 B
打印:打印3
: 3
可以看到A和B是同时打印的。
那么,如果我们希望B在A <代码>全部打印代码>完后再开始打印呢?我们可以利用<代码> thread.join() 代码>方法,代码如下:
私有静态孔隙以及接下来(){ 线程A=新线程(新Runnable () { @Override 公共空间run () { printNumber (“A"); } }); 线程B=新线程(新Runnable () { @Override 公共空间run () { System.out.println (“B开始等待A"); 尝试{ A.join (); }捕捉(InterruptedException e) { e.printStackTrace (); } printNumber (“B"); } }); B.start (); A.start (); }
得到的结果如下:
B开始等待
打印:1
打印:打印2
: 3
B打印:1
B打印:2 B
打印:3
所以我们能看到<代码> A.join() 代码>方法会让B一直等待直到一个运行完毕。
<强>那如何让两个线程按照指定方式有序交叉运行呢? 强>
还是上面那个例子,我现在希望一个在打印完<代码> 1> 代码后,再让B打印<代码> 1,2,3> 代码,最后再回到一个继续打印<代码> 2、3> 代码。这种需求下,显然<代码> Thread.join() 代码>已经不能满足了。我们需要更细粒度的锁来控制执行顺序。
这里,我们可以利用<代码> object.wait() 代码>和<代码> object.notify() 代码>两个方法来实现。代码如下:
/* * 1 * 1,B, B 2 B 3、2、3 */私有静态孔隙demo3 () { 对象锁=新对象(); 线程A=新线程(新Runnable () { @Override 公共空间run () { 同步(锁){ System.out.println (“1“); 尝试{ lock.wait (); }捕捉(InterruptedException e) { e.printStackTrace (); } System.out.println (“2“); System.out.println (“3”); } } }); 线程B=新线程(新Runnable () { @Override 公共空间run () { 同步(锁){ System.out.println (“B 1“); System.out.println (“B 2“); System.out.println (“3 B“); lock.notify (); } } }); A.start (); B.start (); }
打印结果如下:
1
等待……
B 1
B 2 B
3
2
3
正是我们要的结果。
<强>那么,这个过程发生了什么呢? 强>
- <李>首先创建一个A和B共享的对象锁锁=新对象();李