java.util.concurrent之ForkJoin
来源:互联网 发布:淘宝店怎么提升销量 编辑:程序博客网 时间:2024/05/01 13:54
1.关于ForkJoin的基础知识理解:
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。(这个场景并没有实际验证过,仅仅是猜测。)
0 0
- java.util.concurrent之ForkJoin
- java.util.concurrent之CountDownLatch
- java.util.concurrent之CyclicBarrier
- java.util.concurrent之Semaphore
- java.util.concurrent之FutureTask
- java.util.concurrent 之ConcurrentNavigableMap
- java.util.concurrent 之ConcurrentHashMap
- java.util.concurrent 之BlockingQueue
- java.util.concurrent 之TimeUnit
- java.util.concurrent 之 Condition
- java.util.concurrent包之Lock
- Jdk源码阅读之Java.util.concurrent
- java.util.concurrent 之ConcurrentHashMap 源码分析
- java.util.concurrent 之 队列同步器AQS
- java.util.concurrent 之 可重入锁ReentrantLock
- java.util.concurrent学习之 Executor
- Java并发之ForkJoin
- 【java】 java.util.concurrent
- swap函数的泛型
- android 解决部分手机连接热点wifi导致被切换,enablenetwork(netID, true)无效的问题
- 判断用户输入的银行卡号是否正确--基于Luhn算法的格式校验
- UDP接收实例
- Android前端判断敏感词汇
- java.util.concurrent之ForkJoin
- Windows下查询域名的DNS TXT记录的命令
- poj_2065 SETI(高斯消元解同余方程组)
- hashmapper的使用以及json字符串与普通字符串的差异
- Linux下使用shell解压打包jar包
- 【算法模板】图论
- apache 配置动静分离,允许跨域, 并在反向代理的情况下维持默认主页
- pjsip
- Y2K Accounting Bug(POJ 2586)(贪心)