Java中线程之间的通信是如何实现的

  介绍

这篇文章将为大家详细讲解有关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> 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共享的对象锁锁=新对象();李

    Java中线程之间的通信是如何实现的