文章字数:755,阅读全文大约需要3分钟
一、Fork/Join
1.1分治思想
- 体现了分而治之的算法思想
- 将大任务分成若干规模小的子任务
- 规模为
N
的问题,N<阈值
直接解决。N>阈值
分解成若干小规模问题。子问题见互相对立,且与原问题形式相同。子问题的解合并就是原问题的解。 - 动态规划和分治的不同在于动态规划的子问题间没有联系。
1.2 fork/join
Fork
将大问题分成小问题Join
小问题的解合并成大问题的解- 工作窃取,线程执行完自己任务队列的任务后会从其他任务队列最后面取任务执行。节约资源
1 | ForkJoinPool pool = new ForkJoinPool(); |
自定义任务需要继承于RecuriveTask/RecursiveAction/ForkJoinTask
,ForkJoinTask
是父级类,一般用另外两个
1 | // <>里为返回值 |
二、CountDownlatch
- 一个线程等待其他线程工作完成之后执行,加强版的
join
CountDownlatch(n)
初始化n
个标记await()
等待标记数量为0countdown()
标记数量-1
三、CyclicBarrier
- 一组线程达到某个屏障,阻塞。直到一组最后一个到达屏障,开放。
CyclicBarrier(n)
总共几个线程await()
等待所有的线程都到达await()
位置- 等于
CountDownlatch
每个线程自动countdown()
四、Semaphore
- 控制同时访问某个特定资源的数量,常用于流量控制
new Semaphore(n)
初始化n个令牌,release()
可累加超过初始的数acquire()
令牌-1
release()
令牌+1
五、Exchange
- 两个线程之间的数据交换
exchange(Object)
两个线程都调用此方法,线程会阻塞在此位置。直到两个线程都到这个位置,会进行一次数据交换。- 只能适用于两个线程
六、Callable和Future
Callable
可以返回值和抛出异常,线程的业务内容FutureTask
将Callable
包装成Runnable
6.1future接口
isDone
是否结束isCanncelled
任务完成前被取消,返回true
cancel(true)
中断并运行任务,成功返回true
。cancel(false)
不会中断。已结束返回false
get()
阻塞等待结果