前言
多线程的基础功能已经总结完了,还剩几个jdk为我们提供的组件来配合不同的使用场景。今天总结下使用方法,源码等有时间再深究吧。
Timer
Timer的作用
- 执行定时任务。
- 计划时间晚于当前时间:未来执行
- 计划时间早于当前时间:立即执行
- 允许多个任务同时执行
- cancle
- timer的cancle,清除所有的定时任务
- timeTask的cancle,清除某一个任务
CountDownLatch
用”中式英语翻译”就是当”计数未完成时一直锁住”,即规定的线程个数达到预期的状态时触发事件,让其他线程得以继续工作。我觉得还是比较实用的,在”汇总”工作时经常用到。
|
|
SemaPhore
SemaPhore有两个主要的方法:acquire和release。分别是获得和释放信号,在创建SemaPhore指定一个int型的参数,当acquire等于这个数时,后来的acquire方法会被阻塞住,直到release信号时。注意SemaPhore是可以指定公平锁的。
|
|
CyclicBarrier
再次用”用中式英语”理解下字面意思:将给定数量的成员集中在一个屏障点上,然后在统一执行后面的操作。意思即是若干个线程一起执行,当数量达到某个条件时,线程阻塞,等某个任务执行完时,再继续执行await()以后的代码。和前面的CountDownLatch有点像,但是是完全不同的,先运行下代码,再来总结不同点。
|
|
CyclicBarrier和CountDownLatch的区别
根据上面两个demo其实可以理解:
- countDown()方法执行仅仅是给”计数器减一”,然后当前线程不阻塞,继续运行下面的代码,当”计数器为0”时,会触发多个任务;而CyclicBarrier是”计数器”运行到”屏障”前必须阻塞,知道屏障内的代码执行完,前面的线程才会继续执行,并且仅仅只唤醒了一个”屏障内的线程”。
- CyclicBarrier可重用,CountDownLatch不可重用,计数值为0该CountDownLatch就不可再用了。
理解其原理,区别自然是很简单就能说出来了。
Future和Callable
比较简单。跑一遍代码,使用它们的优点是,如果先执行A方法再执行B方法,但是B方法需要10S,A方法需要5S,传统方法等A执行完,再执行B,一共需要15s,造成了时间上的浪费,使用Future和Callable能够并行执行,自然不会存在这样的问题了,传统多线程也能做到,只是不好取的返回值。
|
|
小结
多线程常用知识终于总结完了,其实也没那么复杂,对吧?还是那句话,坚持就是胜利!