JAvaのExecutorService実装スレッドプール


1 ExecutorServiceによるスレッドプールの実装
スレッドプールの概念:まずいくつかのスレッドを作成し、彼らの集合をスレッドプールと呼び、サーバが顧客要求を受信すると、スレッドプールから空きスレッド位置サービスを取り出し、サービスが完了した後、スレッドを閉じずにスレッドを取得プールに戻す.
 
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]