スレッドプールの作成方法と利点

3142 ワード

スレッドプール:
          実際には、複数のスレッドを格納するコンテナであり、スレッドを繰り返し使用することができ、スレッドオブジェクトを頻繁に作成する操作を省くことができ、スレッドを繰り返し作成する必要がなく、リソースを消費しすぎます.
なぜスレッドプールを使用するのか:スレッドプールを合理的に利用することで3つのメリットが得られます.
       1.資源の消耗を減らす.スレッドの作成と破棄の回数を減らし、各作業スレッドを再利用し、複数のタスクを実行できます.
       2.応答速度の向上
       3.スレッドの管理性を高めるスレッドプールの核心思想:スレッド多重化.同じスレッドを繰り返し使用できます.
スレッドプールの作成方法1.
 Javaにおけるスレッドプールの代表:ExecutorService
スレッドプールを作成するAPI:java.util.concurrent.Executorsクラスの下:
        public static ExecutorService newFixedThreadPool(int nThreads)`:スレッドプールオブジェクトを返します.(作成されたのは境界線付きプール、つまり            プール のスレッド数で最大数を指定できます)
スレッドプールにスレッドのAPIを作成するには:
            1.public Future> submit(Runnable task)
            2. Future submit(Callable task);
小結:スレッドプールが起動しても死亡しません.後で繰り返し使用するからです.
public class ThreadPoolsDemo01 {
    public static void main(String[] args) {
        // 1.        3       。
        ExecutorService pools = Executors.newFixedThreadPool(3);
        // 2.public Future> submit(Runnable task)
        Runnable target = new MyRunable();
        //             !       !!
        pools.submit(target);
        pools.submit(target);
        pools.submit(target);
        //    4   !     3          !
        pools.submit(target);

        //        !!
       // pools.shutdownNow(); //        ,        !
        pools.shutdown(); //      ,           !
    }
}

class MyRunable implements Runnable{
    @Override
    public void run() {
        for(int i = 0 ; i < 3 ; i++ ){
            System.out.println(Thread.currentThread().getName()+" => "+ i);
        }
    }
}

スレッドプールの作成方法2.
Javaにおけるスレッドプールの代表:ExecutorService
スレッドプールを作成するAPI:java.util.concurrent.Executorsクラスの下:
public static ExecutorService newFixedThreadPool(int nThreads)`:スレッドプールオブジェクトを返します.(作成されるのは境界線付きプール、つまりプール内のスレッド数で最大数を指定できます)
スレッドプールにスレッドのAPIを作成するには:
1.public Future> submit(Runnable task)
2. Future submit(Callable task);
解析:Callableインタフェーススレッドオブジェクトを作成すると、スレッドが実行した結果を返すことができます.
需要:スレッドプールで1-20および1-100の和を計算します.
まとめ:後でスレッドを作成するには、スレッドプールで行うことをお勧めします.
public class ThreadPoolsDemo02 {
    public static void main(String[] args) throws Exception {
        // 1.        3       。
        ExecutorService pools = Executors.newFixedThreadPool(3);
        //              Callable  ,            !
        //                        !
        Future task1 = pools.submit(new MyCallable(20));
        Future task2 = pools.submit(new MyCallable(100));

        System.out.println(task1.get());
        System.out.println(task2.get());
    }
}

//     
class MyCallable implements Callable{
    private int n ;
    public MyCallable(int n){
        this.n = n;
    }
    @Override
    public String call() throws Exception {
        int sum = 0 ;
        for(int i = 1 ; i <= n ; i++ ){
            sum += i;
            System.out.println(Thread.currentThread().getName()+"  :"+i);
        }
        return Thread.currentThread().getName()+"    :"+sum;
    }
}