Java线程间的通信

http://wingjay.com/2017/04/09/Java%E9%87%8C%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%BA%BF%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%EF%BC%9F/

1、thread.join。

在线程B中加上线程A A.join()方法会让线程B等到线程A运行完毕后执行。

2、object.wait(),object.notify()。

首先创建一个A和B线程共享的对象锁lock = new Object(); 然后在A和B的执行代码块加上synchronized锁

线程A获得锁开始执行,调用lock.wait(),交出锁的控制权,线程B获得锁开始执行,执行结束后调用lock.notify()方法,唤醒正在wait的线程A,继续执行。

3、CountDownLatch  countDownLatch.await(),countDownLatch.countDown。

首先创建一个CountDownLatch对象,构造参数传递需要等待的数量4,先创建一个线程D开始执行,在线程D中调用countDownLatch.await()方法进入等待,直到计数变为0,一次创建线程A,B,C,每个线程执行结束时调用countDownLatch.countDown方法,该方法将会将计数值减少1。当所有其他线程执行完,计数值为0,等待线程D中的wait方法退出,开始执行后续操作。

4、CyclicBarrier cyclicBarrier.await();

首先创建一个CyclicBarrier对象,构造参数传入需要等待的数据,然后依次创建线程ABC,每个线程中做不同时长的事务,线程内调用cyclicBarrier.await()方法,进入等待状态,当所有线程都调用完await方式后,所有线程开始同时执行后续流程。

5、FutureTask   Callable

首先创建一个Callable接口,在call方法中执行需要做的事件。然后new一个FutureTask任务,构造参数传入Callable接口的实例,然后在创建一个线程并启动,线程参数传入的就是这个FutureTask任务。当我们调用futureTask.get获取子线程执行结果时,会阻塞主线程,当子线程执行结束后,futureTask.get返回结果,主线程恢复。如果不希望阻塞主线程,可以考虑利用 ExecutorService,把 FutureTask 放到线程池去管理执行


6、sleep() 和 wait() 的区别就是 调用sleep方法的线程不会释放对象锁,而调用wait() 方法会释放对象锁

你可能感兴趣的:(Java线程间的通信)