Java线程间通信方式的总结

1、thread.join()方法

假设有A、B两个线程,在B线程的run()方法中调用A.join()方法会让 B一直等待直到 A 运行完毕才继续运行。

2、object.wait()和object.notify()

定义全局锁Object lock = new Object();

假设有A、B两个线程,在A线程中执行完想要其执行的部分后调用lock.wait()。

B线程在执行完想要其执行的部分后调用lock.notify(),交出锁的控制权。

当然,A线程和B线程的run()方法内容是在synchronized(lock)下的。

3、CountDownLatch

应用场景:多个线程同时运行完成后目标线程T开始运行,即一个线程等待多个线程的场景

首先创建一个计数器,CountdownLatch countDownLatch = new CountDownLatch(3);

表示有3个线程需要同步运行

在目标线程里调用countDownLatch.await() 方法,进入等待状态,直到计数值变成 0;

在同步运行的线程中,结束前调用countDownLatch.countDown()方法,该方法会将计数值减小1;

当计数值变成 0 时,目标线程里的countDownLatch.await() 立即退出,继续执行其代码。

4、CyclicBarrier

应用场景:实现线程间互相等待再一起执行

首先创建一个CyclicBarrier对象

CyclicBarrier cyclicBarrier = new CyclicBarrier(3);

表示有3个线程需要同步运行

当各个线程准备好执行时,调用cyclicBarrier.await()函数,当3个线程都调用了这个函数后,3个线程开始同步运行。

5、FutureTask和Callable

应用场景:需要子线程传回执行结果

new Callable对象在call()方法中实现子线程的逻辑

用Callable对象座位参数new FutureTask

用FutureTask作为对象new Thread调用start()方法

利用FutureTask对象的get()方法获取计算结果,注意get()方法会阻塞主线程。

你可能感兴趣的:(Java)