ExecutorService固定スレッドプールの作成


          Callable    

1、インタフェースソースの展示:*@see Executor
  • @since 1.5
  • @author Doug Lea
  • @param the result type of method {@code call}/@FunctionalInterface public interface Callable {/*
  • Computes a result, or throws an exception if unable to do so.

  • @return computed result
  • @throws Exception if unable to compute a result */V call() throws Exception; } Callableは汎用インタフェースインタフェースインタフェースにcall()メソッドが指定したタイプを返すことがわかります.2、スレッドを作成して一定数の多重化可能なスレッド数を作成し、タスクを実行する.スレッド数が最大コアスレッド数に達すると、キューに参加して空きスレッドがあるのを待ってプール1を実行します.ここでは固定スレッドプール(今回採用)poolSizeを作成します.すなわち、スレッドプールのスレッド数(ここでは10とします)ExecutorService pool=Executors.newFixedThreadPool(poolSize)で返されるpoolパラメータの詳細は、public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue){this(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,Executors.defaultThreadFactory()、defaultHandlerHandler(defaultHandler));}


  • nThreadsはpoolSizeです.最初のパラメータはコアスレッド数(corePoolSize)です.つまり、スレッドプールが維持すべき最小スレッドの数です.スレッドプールの数がこの値より小さい場合、新しいスレッドが来ると、スレッドプールに空きスレッドがあるかどうかにかかわらず、新しいスレッドが作成されます.2番目のパラメータは最大スレッド数(maximumPoolSize)で、スレッドプールで最大作成スレッドの数です.3番目のパラメータはフリースレッド生存時間(keepAliveTime)であり、デフォルトでは、スレッドプール内のスレッド数がコアスレッド数(corePoolSize)より大きい場合にのみ、keepAliveTimeが機能し、スレッドプール内のスレッド数がコアスレッド数(corePoolSize)より大きくないまで、すなわち、スレッドプール内のスレッド数がコアスレッド数(corePoolSize)より大きい場合、スレッドの空き時間が空きスレッド生存時間(keepAliveTime)に達すると、スレッドプール内のスレッド数がコアスレッド数(corePoolSize)を超えないまでスレッドは終了しますが、allowCoreThreadTimeOut(true)メソッドが呼び出されると、スレッドプール内のスレッド数がコアスレッド数を超えない場合(corePoolSize)、フリースレッド生存時間(keepAliveTime)パラメータも、スレッドプール内のスレッド数が0になるまで機能します.4番目のパラメータとアイドルスレッドの生存時間(keepAliveTime)の同じパラメータは、その単位を指定します.TimeUnit.DAYS;//天TimeUnit.HOURS;//時間TimeUnit.MINUTES;//分単位SECONDS;//秒単位MILLISECONDS;//ミリ秒MICROSECONDS;//微妙なTimeUnit.NANOSECONDS;//ナノ秒の5番目のパラメータBlockingQueue workQueueは、実行待ちのタスクを格納するブロックされたタスクキューです.1、ArrayBlockingQueue
    2、 LinkedBlockingQueue
    3、 SynchronousQueue
    4、 PriorityBlockingQueue
    return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); タスクを実行するために多重化可能なスレッドを一定数作成します.2、キャッシュ可能なスレッドプールExecutorService cachePool=Executorsを作成することもできます.newCachedThreadPool(); 戻ってきたpoolの中でInteger.MAX_VALUEはintクラス整数の最大値2の31乗-1=21748647 return new ThreadPoolExecutor(0,Integer.MAX_VALUE,60 L,TimeUnit.SECONDS,new SynchronousQueue()である.つまり、スレッドの最大数がIntegerの最大値であるアイドルスレッドの生存時間は60 Lである1分である.時間のかかるタスクが多数ある場合は、ライフサイクルの短いタスクにのみ適した作成方法ではありません.3、ワンウェイプールExecutorService singlePool=Executorsを作成することもできます.newSingleThreadExecutor(); 戻ってきたsinglePool return new F i n a l i z a bleDelegatedExecutorService(new ThreadPoolExecutor(1,1,0 L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue()1つのスレッドのみで間欠的に実行する4、固定スレッド数、タイミングおよび周期的タスクをサポートするスレッドプール(poolSizeはコアスレッド数)ExecutorService schedulePool=Executorsを作成することもできる.newScheduledThreadPool(poolSize)
    public ScheduledThreadPoolExecutor(int corePoolSize) { super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue()); } 例:package com.test;
    import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit;
    public class TestStartPool {
    private static final  int poolSize=10;//      10 
    ExecutorService pool=Executors.newFixedThreadPool(poolSize);//          
    
    
    public static void main(String[] args) {
        TestStartPool testStartPool = new TestStartPool();
        testStartPool.createPool();
    }
    
    /**
     *         list                    
     */
    public  void createPool() {
        List invokers = new ArrayList<>();
        List list=new ArrayList();
        int name=0;
        for(int a=0;a invokers){
        try {
            List>> futures = pool.invokeAll(invokers, 10, TimeUnit.MILLISECONDS);
            for(int a=1;a> thread = futures.get(a - 1);
                if(thread !=null){
                    try {
                        //      
                        if(thread.isDone()) {
                            List result = thread.get();
                            System.out.println("  "+result.get(0)+"     "+result.get(1));
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    }
    package com.test;
    import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable;
    public class TestPoolExecutor implements Callable {
    private  List list;
    private int name;
    private int testnum;
    
    public TestPoolExecutor(List list, int name) {
        this.list = list;
        this.name = name;
    }
    
    @Override
    public List call() throws Exception {
        System.out.println("  "+name+"    ++++++");
        //              
        List  testlist=new ArrayList();
        testlist.add(String.valueOf(name));//       
        testnum=name+2;
        testlist.add(String.valueOf(testnum));//            
        return testlist;
    }
    

    スレッド1実行開始+++++++スレッド2実行開始+++++++++スレッド6実行開始+++++++++++スレッド10実行開始+++++++++スレッド5実行開始+++++++++スレッド9実行開始+++++++++スレッド3実行開始++++++スレッド7実行開始+++++スレッド4実行開始+++++++スレッド8実行開始++++++++スレッド1実行結果3スレッド2実行結果4スレッド3実行結果5実行スレッド4実行結果結果6スレッド5実行結果7スレッド6実行結果8スレッド7実行結果9スレッド8実行結果10スレッド9実行結果11スレッド10実行結果12
    ソースダウンロードアドレスftp://111.231.112.6/Java/ソース/マルチスレッド/