【发布时间】:2018-02-04 04:06:28
【问题描述】:
我的问题最好通过给出代码 sn-p 来解释:
public static void main(final String[] a) {
Stream.of(1, 2, 3, 4).map(i -> ForkJoinPool.commonPool().submit(new RecursiveAction() {
@Override
protected void compute() {
System.out.println(Thread.currentThread());
}
})).forEach(ForkJoinTask::join);
}
在我有 4 个内核的笔记本电脑上运行它时,会打印:
Thread[main,5,main]
Thread[ForkJoinPool.commonPool-worker-1,5,main]
Thread[main,5,main]
Thread[ForkJoinPool.commonPool-worker-1,5,main]
为什么某些任务跑在主线程中,主线程是普通fork join线程池之外的线程?
在创建自定义 fork join 线程池时,不会发生这种情况:
public static void main(final String[] a) {
final ForkJoinPool p = new ForkJoinPool(4);
Stream.of(1, 2, 3, 4).map(index -> p.submit(new RecursiveAction() {
@Override
protected void compute() {
System.out.println(Thread.currentThread());
}
})).forEach(ForkJoinTask::join);
}
Thread[ForkJoinPool-1-worker-1,5,main]
Thread[ForkJoinPool-1-worker-1,5,main]
Thread[ForkJoinPool-1-worker-1,5,main]
Thread[ForkJoinPool-1-worker-1,5,main]
那么,换句话说,公共池有什么特别之处?有了这些知识,在公共池中执行长时间运行的任务是明智的还是不明智的想法?
【问题讨论】:
-
你应该等到得到几个答案后再接受错误的答案。
-
@edharned 随意创建一个包含更多见解的新答案!很想听到更多。接受的答案总是可以更改的,所以没有问题。
标签: java java.util.concurrent fork-join forkjoinpool