文章字数: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()令牌-1release()令牌+1
五、Exchange
- 两个线程之间的数据交换
exchange(Object)两个线程都调用此方法,线程会阻塞在此位置。直到两个线程都到这个位置,会进行一次数据交换。- 只能适用于两个线程
六、Callable和Future
Callable可以返回值和抛出异常,线程的业务内容FutureTask将Callable包装成Runnable
6.1future接口
isDone是否结束isCanncelled任务完成前被取消,返回truecancel(true)中断并运行任务,成功返回true。cancel(false)不会中断。已结束返回falseget()阻塞等待结果