alibaba/transmittable-thread-local

support ForkJoinPool of jdk 7

Closed this issue · 3 comments

#74

可能涉及的编译管理 ☑️

  • 需要解决:使用Java 6编译、运行和测试时,不能去涉及使用了Java 7才有的Fork/Join框架的类,即在Java 6下需要条件编译

因为2.5.0+全支持不同的JDK版本,不再需要 条件编译复杂的方式 了。 ☑️

一些相关资料



Doug Lea论文 Java Fork/Join框架
https://github.com/oldratlee/translations/blob/master/a-java-fork-join-framework/README.md



补充一点相关资料
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(); //
    }
}
  1. ForkJoinTask.exec() 是抽象类方法,不好包装.
  2. ForkJoinWorkerThread.afterTopLevelExec() 限制包内访问,而且runTask()没有类似beforeTopLevelExec()的方法和执行点。
    以上是我分析过程的思路和遇到的问题记录下.

上面是普通修饰实现方式的难点,如只是非public方法可以用 反射的方式 调用。
再看了一下因为要代理ForkJoinTask『类』,且有方法是final、private(javassit也应该不行),
aop如你所说应该有困难,麻烦

而对于agent方式,因为可以改写Pool类、ForkJoinTask类方法实现,应该是可以实现。

通过 PR #83 By @LNAmp ❤️ 和 PR #85 By @wuwen5 ❤️

实现了一个版本。发布了版本 2.4.0