(w = (ForkJoinWorkerThread)t).pool == this) w.pushTask(task); else addSubmission(task); } forkOrSubmit程序执行图如下: 在addSubmission方法中,进行子任务添加,在判断条件if ((q = submissionQueue) != null)中,因为submissionQueue在初始化ForkJoinPool时,在构造函数中就已经赋值( this.submissionQueue...
*/protectedForkJoinWorkerThread(ForkJoinPool pool){// Use a placeholder until a useful name can be set in registerWorkersuper("aForkJoinWorkerThread");this.pool=pool;this.workQueue=pool.registerWorker(this);} 其构造函数主要是创建一个在给定pool中的ForkJoinWorkerThread。 构造函数中最主要的方法就...
*/protectedForkJoinWorkerThread(ForkJoinPool pool){// Use a placeholder until a useful name can be set in registerWorkersuper("aForkJoinWorkerThread");this.pool=pool;this.workQueue=pool.registerWorker(this);} 其构造函数主要是创建一个在给定pool中的ForkJoinWorkerThread。 构造函数中最主要的方法就...
Runtime.getRuntime().availableProcessors()),defaultForkJoinWorkerThreadFactory,null,false);}// 创建一个包含parallelism个并行线程的ForkJoinPoolpublicForkJoinPool(intparallelism){this(parallelism,
ForkJoinPool.WorkQueue 这是ForkJoinPool类的内部类。也是线程池核心的组成部分。ForkJoinPool线程池将由WorkQueue数组组成。为了进一步提高性能,与ThreadPoolExecutor不一样的是,这没有采用外部传入的任务队列,而是作者自己实现了一个阻塞队列。 ForkJoinWorkerThread 线程池中运行的thread也是作者重新定义的。这个类的目的...
*/publicclassForkJoinMergeSort{publicstaticvoidmain(String[]args){ForkJoinPoolforkJoinPool=newForkJoinPool(6);int[]arr={3,2,6,1,7,10,2,3,5,6};Tasktask=newTask(arr,0,arr.length-1);forkJoinPool.invoke(task);for(inti:arr){System.out.println(i);}}staticclassTaskextendsRecursiveTask<Void...
ForkJoinPool作为最核心的组件,维护了所有的任务队列WorkQueues,workQueues维护着所有线程池的工作线程,工作窃取算法就是在这里进行的。 每一个WorkQueue对象中使用pool保留对ForkJoinPool的引用,用来获取其WorkQueues来窃取其他工作线程的任务来执行。 同时WorkQueue对象中的owner是ForkJoinWorkerThread工作线程,绑定ForkJoinWo...
privateForkJoinPool(int parallelism,ForkJoinWorkerThreadFactory factory,UncaughtExceptionHandler handler,int mode,String workerNamePrefix){this.workerNamePrefix=workerNamePrefix;this.factory=factory;this.ueh=handler;this.config=(parallelism&SMASK)|mode;long np=(long)(-parallelism);// offset ctl countsthi...
另外,fork-join pool还有一个特点就是work stealing。每个工作线程都有自己的工作队列,这是使用deque来实现的。当一个任务划分一个新线程时,它将自己推到 deque 的头部。当一个任务执行与另一个未完成任务的合并操作时,它会将另一个任务推到队列头部并执行,而不会休眠以等待另一任务完成(像 Thread.join() 的...
1,ForkJoinPool:充当fork/join框架里面的管理者,最原始的任务都要交给它才能处理。它负责控制整个fork/join有多少个workerThread,workerThread的创建,激活都是由它来掌控。它还负责workQueue队列的创建和分配,每当创建一个workerThread,它负责分配相应的workQueue。然后它把接到的活都交给workerThread去处理,它可以说是整...