當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java ForkJoinPool Class用法及代碼示例


ForkJoinPool 類是 fork/join 框架的中心,它是 ExecutorService 接口的實現。 ForkJoinPool 類是 AbstractExecutorService 類的擴展,它實現了 fork/join 框架的 work-stealing 算法(即,沒有事情可做的工作線程可以從其他仍然忙碌的線程中竊取任務)並可以執行ForkJoinTask進程。

ForkJoinPool 類從 java.util.concurrent.AbstractExecutorService 類繼承以下方法:

  • invokeAll()
  • invokeAny()

ForkJoinPool 類從繼承自類 java.lang.Object 類的Methods 繼承以下方法:

  • clone()
  • equals()
  • finalize()
  • getClass()
  • hashCode()
  • notify()
  • notifyAll()
  • wait()

用法:

public class ForkJoinPool extends AbstractExecutorService  

Fork:Fork步驟將任務分割成更小的子任務,並且這些任務並發執行。

Join:子任務執行後,任務可能會將所有結果連接成一個結果。

如下圖所示:

ForkJoinPool-Class-in-Java-with-Examples

例子:

getActiveThreadCount():此方法返回當前正在竊取或執行任務的線程的估計數量。它可能會高估活動線程的數量。

用法

public int getActiveThreadCount()

Java


// Java program to demonstrate the
// Implementation of getActiveThreadCount()
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
class NewTask extends RecursiveAction 
{
    private long Load = 0;
     
    public NewTask(long Load) { this.Load = Load; }
    protected void compute()
    {
        // fork tasks into smaller subtasks
        List<NewTask> subtasks = new ArrayList<NewTask>();
        subtasks.addAll(createSubtasks());
         
        for (RecursiveAction subtask : subtasks) {
            subtask.fork();
        }
    }
     
    // function to create and add subtasks
    private List<NewTask> createSubtasks()
    {
        // create subtasks
        List<NewTask> subtasks = new ArrayList<NewTask>();
        NewTask subtask1 = new NewTask(this.Load / 2);
        NewTask subtask2 = new NewTask(this.Load / 2);
        NewTask subtask3 = new NewTask(this.Load / 2);
         
        // to add the subtasks
        subtasks.add(subtask1);
        subtasks.add(subtask2);
        subtasks.add(subtask3);
         
        return subtasks;
    }
}
public class JavaForkJoingetActivethreadcountExample1 {
    public static void main(final String[] arguments)
        throws InterruptedException
    {
        // get no. of available core available
        int proc = Runtime.getRuntime().availableProcessors();
         
        System.out.println("Number of available core in the processor is: "
            + proc);
             
        // get no. of threads active
        ForkJoinPool Pool = ForkJoinPool.commonPool();
         
        System.out.println("Number of active thread before invoking: "
            + Pool.getActiveThreadCount());
             
        NewTask t = new NewTask(400);
         
        Pool.invoke(t);
         
        System.out.println("Number of active thread after invoking: "
            + Pool.getActiveThreadCount());
        System.out.println("Common Pool Size is: "
                           + Pool.getPoolSize());
    }
}


輸出
Number of available core in the processor is: 4
Number of active thread before invoking: 0
Number of active thread after invoking: 3
Common Pool Size is: 3

Methods of ForkJoinPool Class

METHOD

DESCRIPTION

public boolean waitQuithesis(長時間超時,TimeUnit單位) 此方法執行池直到池靜止,否則,協助執行任務直到指定的時間值和單位過去或池靜止。
public boolean waitTermination(長超時,TimeUnit單位) 此方法會阻塞,直到所有任務在關閉請求後完成執行,或者發生超時,或者當前線程被中斷,以先發生者為準。
公共靜態ForkJoinPool commonPool() 該方法返回公共池實例。
公共無效執行(可運行任務) 此方法在將來的某個時間執行給定的命令。
公共 int getActiveThreadCount() 此方法返回當前正在竊取或執行任務的線程的估計數量。它可能會高估活動線程的數量。
公共布爾值getAsyncMode() 如果此池對從未加入的分叉任務使用本地先進先出調度模式,則此方法返回 true。
公共靜態int getCommonPoolParallelism() 此方法返回公共池的目標並行度級別。
公共 ForkJoinPool.ForkJoinWorkerThreadFactory getFactory() 此方法返回用於構造新工人的工廠。
公共 int getParallelism() 此方法返回該池的目標並行度級別。
公共 int getPoolSize() 此方法返回已啟動但尚未終止的工作線程數。
公共 int getQueuedSubmissionCount() 此方法返回提交到此池但尚未開始執行的任務數量的估計值。
公共長getQueuedTaskCount() 此方法返回當前由工作線程保留在隊列中的任務總數的估計值
公共 int getRunningThreadCount() 此方法返回未阻塞等待加入任務或其他托管同步的工作線程數量的估計值。
公共長getStealCount() 此方法返回一個線程的工作隊列中被另一個線程竊取的任務總數的估計值。
公共 Thread.UncaughtExceptionHandler getUncaughtExceptionHandler() 此方法返回由於執行任務時遇到不可恢複的錯誤而終止的內部工作線程的處理程序。
公共布爾值hasQueuedSubmissions() 如果有任何任務提交到此池但尚未開始執行,則此方法返回 true。
公共 <T> T 調用(ForkJoinTask<T> 任務) 此方法執行給定的任務並在完成後返回其結果。
公共布爾值isQuiescent() 如果所有工作線程當前都處於空閑狀態,則此方法返回 true。
公共布爾值isShutdown() 如果調用 isShutdown() 的池已關閉,則此方法返回 true。
公共布爾值isTerminated() 如果關閉後所有任務均已完成,則此方法返回 true。
公共布爾值isTerminating() 如果終止過程已開始但尚未完成,則此方法返回 true。
protected <T> RunnableFuture<T> newTaskFor(Callable<T> 可調用) 此方法返回一個 RunnableFuture,它在運行時將調用底層可調用對象,並且作為 Future,將產生可調用對象的結果作為其結果,並提供底層任務的取消。
公共無效shutdown() 如果該池已關閉,則此方法返回 true。
公共列表<可運行> shutdownNow() 此方法可能會嘗試取消和/或停止所有任務,並拒絕所有隨後提交的任務。
public ForkJoinTask<?> 提交(可運行任務) 此方法提交一個 Runnable 任務以供執行,並返回代表該任務的 Future。
公共字符串toString() 此方法返回一個標識該池及其狀態的字符串,包括運行狀態、並行級別以及工作線程和任務計數的指示。


相關用法


注:本文由純淨天空篩選整理自surbhityagi15大神的英文原創作品 ForkJoinPool Class in Java with Examples。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。