スレッドプールの作成方法と利点
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);
小結:スレッドプールが起動しても死亡しません.後で繰り返し使用するからです.
スレッドプールの作成方法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の和を計算します.
まとめ:後でスレッドを作成するには、スレッドプールで行うことをお勧めします.
実際には、複数のスレッドを格納するコンテナであり、スレッドを繰り返し使用することができ、スレッドオブジェクトを頻繁に作成する操作を省くことができ、スレッドを繰り返し作成する必要がなく、リソースを消費しすぎます.
なぜスレッドプールを使用するのか:スレッドプールを合理的に利用することで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;
}
}