java常用并发_java一些常用并发工具示例

最近把《java并发编程实战》-Java Consurrency in Practice 重温了一遍,把书中提到的一些常用工具记录于此:

一、闭锁(门栓)- CountDownLatch

适用场景:多线程测试时,通常为了精确计时,要求所有线程都ready后,才开始执行,防止有线程先起跑,造成不公平,类似的,所有线程执行完,整个程序才算运行完成。

执行结果:

线程-1 is running...

线程-5 is running...

线程-8 is running...

线程-4 is running...

线程-3 is running...

线程-0 is running...

线程-2 is running...

线程-9 is running...

线程-7 is running...

线程-6 is running...

done! exec time => 13 ms

注:大家可以把第14行注释掉,再看看运行结果有什么不同。

二、信号量(Semaphore)

适用场景:用于资源数有限制的并发访问场景。

上面的示例将一个普通的Set变成了有界容器。执行结果如下:

0 added !

1 added !

2 added !

3 added !

4 added !

5 not add to Set!

三、栅栏CyclicBarrier

这个跟闭锁类似,可以通过代码设置一个『屏障』点,其它线程到达该点后才能继续,常用于约束其它线程都到达某一状态后,才允许做后面的事情。

这里我们假设有一个worder线程,里面有2步操作,要求所有线程完成step1后,才能继续step2. 执行结果如下:

Thread-0 step 1 ...

Thread-1 step 1 ...

Thread-2 step 1 ...

Thread-3 step 1 ...

Thread-4 step 1 ...

Thread-5 step 1 ...

Thread-6 step 1 ...

Thread-7 step 1 ...

Thread-8 step 1 ...

Thread-9 step 1 ...

Thread-9 step 2 ...

Thread-0 step 2 ...

Thread-3 step 2 ...

Thread-4 step 2 ...

Thread-6 step 2 ...

Thread-2 step 2 ...

Thread-1 step 2 ...

Thread-8 step 2 ...

Thread-7 step 2 ...

Thread-5 step 2 ...

四、Exchanger

如果2个线程需要交换数据,Exchanger就能派上用场了,见下面的示例:

执行结果:

thread 1 交换前:AAAAAA

thread 2 交换前:BBBBBB

thread 2 交换后:AAAAAA

thread 1 交换后:BBBBBB

五、FutureTask/Future

一些很耗时的操作,可以用Future转化成异步,不阻塞后续的处理,直到真正需要返回结果时调用get拿到结果

执行结果:

就绪。。。

主线程其它处理。。。

很耗时的操作处理中。。。

done

处理完成!

-----------------

executor 就绪。。。

很耗时的操作处理中。。。

done

六、阻塞队列BlockingQueue

阻塞队列可以在线程间实现生产者-消费者模式。比如下面的示例:线程producer模拟快速生产数据,而线程consumer模拟慢速消费数据,当达到队列的上限时(即:生产者产生的数据,已经放不下了),队列就堵塞住了。

执行结果:

producer 1 产生了一个数字:6773

consumer 1 消费了一个数字:6773

producer 1 产生了一个数字:4456

producer 1 产生了一个数字:8572

producer 1 产生了一个数字:5764

producer 1 产生了一个数字:2874

producer 1 产生了一个数字:780 # 注意这里就已经堵住了,直到有消费者消费一条数据,才能继续生产

consumer 1 消费了一个数字:4456

producer 1 产生了一个数字:4193

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值