support ForkJoinPool of jdk 7
Closed this issue · 3 comments
oldratlee commented
可能涉及的编译管理 ☑️
- 需要解决:使用Java 6编译、运行和测试时,不能去涉及使用了Java 7才有的Fork/Join框架的类,即在Java 6下需要条件编译
- Maven: excluding java files in compilation https://stackoverflow.com/questions/17920920
因为2.5.0+
全支持不同的JDK
版本,不再需要 条件编译复杂的方式 了。 ☑️
一些相关资料
- Java 并发编程笔记:如何使用 ForkJoinPool 以及原理 http://blog.dyngr.com/blog/2016/09/15/java-forkjoinpool-internals/
- Fork/Join框架(一)引言 http://ifeve.com/fork-join-1/
- Fork/Join框架(二)创建一个Fork/Join池 http://ifeve.com/fork-join-2/
- Fork/Join框架(三)加入任务的结果 http://ifeve.com/fork-join-3/
- Fork/Join框架(四)异步运行任务 http://ifeve.com/fork-join-4/
- Fork/Join框架(五)在任务中抛出异常 http://ifeve.com/fork-join-5/
- Fork/Join框架(六)取消任务 http://ifeve.com/fork-join-6/
Doug Lea论文 Java Fork/Join框架:
https://github.com/oldratlee/translations/blob/master/a-java-fork-join-framework/README.md
- 聊聊并发(八)——Fork/Join框架介绍
- 定制并发类(七)实现ThreadFactory接口生成自定义的线程给Fork/Join框架 http://ifeve.com/customizing-concurrency-classes-7/
- 定制并发类(八)自定义在 Fork/Join 框架中运行的任务 http://ifeve.com/customizing-concurrency-classes-9-2/
wuwen5 commented
补充一点相关资料
http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-December/024044.html
目前主要围绕ForkJoinPool.runTask()
这个方法分析.
final void runTask(ForkJoinTask<?> task) {
if (task != null) {
scanState &= ~SCANNING; // mark as busy
(currentSteal = task).doExec();
U.putOrderedObject(this, QCURRENTSTEAL, null); // release for GC
execLocalTasks();
ForkJoinWorkerThread thread = owner;
if (++nsteals < 0) // collect on overflow
transferStealCount(pool);
scanState |= SCANNING;
if (thread != null)
thread.afterTopLevelExec(); //
}
}
ForkJoinTask.exec()
是抽象类方法,不好包装.ForkJoinWorkerThread.afterTopLevelExec()
限制包内访问,而且runTask()
没有类似beforeTopLevelExec()
的方法和执行点。
以上是我分析过程的思路和遇到的问题记录下.
oldratlee commented
上面是普通修饰实现方式的难点,如只是非public方法可以用 反射的方式 调用。
再看了一下因为要代理ForkJoinTask『类』,且有方法是final、private(javassit也应该不行),
aop如你所说应该有困难,麻烦
而对于agent方式,因为可以改写Pool类、ForkJoinTask类方法实现,应该是可以实现。