JAvaのExecutorService実装スレッドプール
3832 ワード
1 ExecutorServiceによるスレッドプールの実装
スレッドプールの概念:まずいくつかのスレッドを作成し、彼らの集合をスレッドプールと呼び、サーバが顧客要求を受信すると、スレッドプールから空きスレッド位置サービスを取り出し、サービスが完了した後、スレッドを閉じずにスレッドを取得プールに戻す.
2オンラインスレッドプールのプログラミングモードでは、タスクはスレッドプール全体にコミットされ、あるスレッドに直接渡すのではなく、スレッドプールはタスクを取得した後、内部に空きのないスレッドを見つけ、人物を内部の空きスレッドに渡す.
3つのスレッドは同時に1つのタスクしか実行できませんが、同時に1つのスレッドにダーゴの人物を提出することができます.
ExcertorServiceを使用したスレッドプールの実装には、次のいくつかの実装ポリシーがあります.
-->Executors.newCachedThreadPool()
-->必要に応じて新しいスレッドを作成できるスレッドプールを作成しますが、作成したスレッドが使用可能な場合は再利用します.
Exceutors.newFixedThreadPool(int nTreads)
固定スレッドのセットを再利用可能なスレッドプールを作成し、共有された無境界キューでスレッドを実行します.
Executors.newScheduledThreaPool(int corePoolSize)
指定された遅延後にコマンドを実行したり、定期的に実行したりするスレッドプールを作成します.
Executors.newSingleThreadExecutor()
単一のworkerスレッドを使用するExecutorを作成し、スレッドを無境界キューで実行します.
テストコード:
テストコード:
スレッドプールの概念:まずいくつかのスレッドを作成し、彼らの集合をスレッドプールと呼び、サーバが顧客要求を受信すると、スレッドプールから空きスレッド位置サービスを取り出し、サービスが完了した後、スレッドを閉じずにスレッドを取得プールに戻す.
2オンラインスレッドプールのプログラミングモードでは、タスクはスレッドプール全体にコミットされ、あるスレッドに直接渡すのではなく、スレッドプールはタスクを取得した後、内部に空きのないスレッドを見つけ、人物を内部の空きスレッドに渡す.
3つのスレッドは同時に1つのタスクしか実行できませんが、同時に1つのスレッドにダーゴの人物を提出することができます.
ExcertorServiceを使用したスレッドプールの実装には、次のいくつかの実装ポリシーがあります.
-->Executors.newCachedThreadPool()
-->必要に応じて新しいスレッドを作成できるスレッドプールを作成しますが、作成したスレッドが使用可能な場合は再利用します.
Exceutors.newFixedThreadPool(int nTreads)
固定スレッドのセットを再利用可能なスレッドプールを作成し、共有された無境界キューでスレッドを実行します.
Executors.newScheduledThreaPool(int corePoolSize)
指定された遅延後にコマンドを実行したり、定期的に実行したりするスレッドプールを作成します.
Executors.newSingleThreadExecutor()
単一のworkerスレッドを使用するExecutorを作成し、スレッドを無境界キューで実行します.
テストコード:
</pre><pre name="code" class="java">import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.management.InstanceNotFoundException;
/**
*
* 1
* 2
* CPU , ,
* , ,
* @author soft01
*
*/
public class ThreadPoolDemo1 {
public static void main(String[] args) {
//
ExecutorService threadPool=Executors.newFixedThreadPool(2);
for(int i=0;i<5;i++){
Runnable runable=new Runnable(){
@Override
public void run() {
// TODO
Thread t=Thread.currentThread();
System.out.println(t+" ");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO catch
System.out.println(" ");
//e.printStackTrace();
}
System.out.println(t+" ");
}
};
System.out.println(" "+i+" ");
threadPool.execute(runable);
}
/*
* shutdown
* shutdown
*/
// threadPool.shutdown();
threadPool.shutdownNow();
System.out.println(" ");
}
}
:
0
1
Thread[pool-1-thread-1,5,main]
2
3
4
Thread[pool-1-thread-1,5,main]
Thread[pool-1-thread-2,5,main]
Thread[pool-1-thread-2,5,main]
テストコード:
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.management.InstanceNotFoundException;
/**
*
* 1
* 2
* CPU , ,
* , ,
* @author soft01
*
*/
public class ThreadPoolDemo1 {
public static void main(String[] args) {
//
ExecutorService threadPool=Executors.newFixedThreadPool(2);
for(int i=0;i<5;i++){
Runnable runable=new Runnable(){
@Override
public void run() {
// TODO
Thread t=Thread.currentThread();
System.out.println(t+" ");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO catch
System.out.println(" ");
//e.printStackTrace();
}
System.out.println(t+" ");
}
};
System.out.println(" "+i+" ");
threadPool.execute(runable);
}
/*
* shutdown
* shutdown
*/
threadPool.shutdown();
//threadPool.shutdownNow();
System.out.println(" ");
}
}
:
0
1
Thread[pool-1-thread-1,5,main]
2
3
4
Thread[pool-1-thread-2,5,main]
Thread[pool-1-thread-1,5,main]
Thread[pool-1-thread-1,5,main]
Thread[pool-1-thread-2,5,main]
Thread[pool-1-thread-2,5,main]
Thread[pool-1-thread-1,5,main]
Thread[pool-1-thread-1,5,main]
Thread[pool-1-thread-2,5,main]
Thread[pool-1-thread-1,5,main]