java.util.concurrent之ForkJoin
2016-12-22 13:44
302 查看
1.关于ForkJoin的基础知识理解:
http://tutorials.jenkov.com/java-util-concurrent/java-fork-and-join-forkjoinpool.html
2.个人理解:
2-1. fork:
按照fork join的模型,大任务首先要分解成小任务,当执行myRecursiveAction.fork()时,会创建worker线程:ForkJoinWorkerThread,这个worker线程就会执行提交的任务。但是分解任务的方法不是自动的,需要代码处理,如下:
2-2. join:
2-3. 使用时注意事项:
注意deadlock,如在compute中分解任务task->subtask,然后对subtask继续fork,再对subtask执行join方法,因为该worker会等待join方法完成,但是subtask的fork方法又在等待该worker线程的释放,此时可能发生deadlock。(这个场景并没有实际验证过,仅仅是猜测。)
http://tutorials.jenkov.com/java-util-concurrent/java-fork-and-join-forkjoinpool.html
2.个人理解:
public class Main { public static void main(String[] args) throws InterruptedException { MyRecursiveAction myRecursiveAction = new MyRecursiveAction(24);//MyRecursiveAction类的实现在上面的URL中 myRecursiveAction.fork(); TimeUnit.SECONDS.sleep(10);//这个睡眠是为了观察action执行compute的时机 myRecursiveAction.join(); } }
2-1. fork:
myRecursiveAction.fork();
按照fork join的模型,大任务首先要分解成小任务,当执行myRecursiveAction.fork()时,会创建worker线程:ForkJoinWorkerThread,这个worker线程就会执行提交的任务。但是分解任务的方法不是自动的,需要代码处理,如下:
@Override protected void compute() { //if work is above threshold, break tasks up into smaller tasks if(this.workLoad > 16) { System.out.println("Splitting workLoad : " + this.workLoad); List<MyRecursiveAction> subtasks = new ArrayList<MyRecursiveAction>(); subtasks.addAll(createSubtasks()); for(RecursiveAction subtask : subtasks){ subtask.fork(); } } else { System.out.println("Doing workLoad myself: " + this.workLoad); } }这个compute方法就是要执行的具体任务,但是在分解任务中,这个本来要执行的具体任务变成了执行分解的任务。
2-2. join:
myRecursiveAction.join();这个方法等待所有的任务执行完成之后,但是要注意的是,当fork的compute方法执行任务分解时,可能需要等待子任务(就是被分解之后的任务)完成,这时需要在compute中调用join方法,否则最外层调用的join方法返回时,完成的只是部分任务。(参照上面的URL里面的RecursiveTask使用方法)。
2-3. 使用时注意事项:
注意deadlock,如在compute中分解任务task->subtask,然后对subtask继续fork,再对subtask执行join方法,因为该worker会等待join方法完成,但是subtask的fork方法又在等待该worker线程的释放,此时可能发生deadlock。(这个场景并没有实际验证过,仅仅是猜测。)
相关文章推荐
- 《java.util.concurrent 包源码阅读》25 Fork/Join框架之Fork与Work-Stealing(重写23,24)
- 《java.util.concurrent 包源码阅读》22 Fork/Join框架的初体验
- 《java.util.concurrent 包源码阅读》26 Fork/Join框架之Join
- 《java.util.concurrent 包源码阅读》24 Fork/Join框架之Work-Stealing
- java.util.concurrent 之 Fork/Join
- 《java.util.concurrent 包源码阅读》23 Fork/Join框架之Fork的冰山一角
- Java concurrent Fork/Join
- java.util.concurrent 包源码分析之Fork/Join框架
- java.util.concurrent系列文章--(4)非阻塞算法简介
- 异常:java.util.ConcurrentModificationException
- JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
- 异常:java.util.ConcurrentModificationException
- java.util.concurrent系列文章--(3)基于硬件同步原语的原子类型
- java.util.ConcurrentModificationException 异常
- 异常:java.util.ConcurrentModificationException
- java线程并发包util.concurrent的研究(一)
- [J2SE]JDK5新特性——java.util.concurrent 线程池
- java.util.ConcurrentModificationException异常的解决办法
- java.util.concurrent系列文章--(6)网络服务的简单实践
- Java5增加了新的类库并发集java.util.concurrent,该类库为并发程序提供了丰富的API