スレッドプールの紹介とその管理


スレッド・プールの最下位でブロッキング・キューBlockingQueueを使用
同時キュー非ブロックキューConcurrentLinkedQueue(poll peek)ブロックキューBlockingQueue(ArrayBlockingQueue offer)
ブロックキューと非ブロックキュー
ブロッキングキューは、生産者と消費者のシーン生産者によく使用されます.->キュー->消費者がブロッキングされる場合は、主に次の2つがあります.
  • キューがいっぱいになったときにエンキュー動作
  • を行う.
  • キューが空であるときにデキュー動作
  • を行う.
    列に入ると、キューがいっぱいになると、ブロックされていないキューで、キュー情報が失われます.キューをブロックし、待機します.列が出ると、キューが空の場合:非ブロックキュー、nullブロックキューに戻り、待機します.
    public static void main(String[] args) throws InterruptedException {
    //    3
      ArrayBlockingQueue abQueue = new ArrayBlockingQueue(3);
      // 
      System.out.println(" ");
      abQueue.offer("student1");
      abQueue.offer("student2");
      abQueue.offer("student3");
      abQueue.offer("student4",3,TimeUnit.SECONDS);
      System.out.println(" ");
    
    
    // 
      System.out.println(" ");
      System.out.println(" "+abQueue.size());
      System.out.println(" :"+abQueue.poll());
      System.out.println(" :"+abQueue.poll());
      System.out.println(" :"+abQueue.poll());
      System.out.println(" :"+abQueue.poll());
      System.out.println(" ");
    
    

    キューをブロックするスレッド
    public class ArrayBlockQueueThread {
     //    3
     public static ArrayBlockingQueue  abQueue= new ArrayBlockingQueue(3);
    public static void main(String[] args) {
    Thread t1 = new Thread(()->{
    try {
        System.out.println(" ");
        abQueue.offer("student1");
        abQueue.offer("student2",3,TimeUnit.SECONDS);
        abQueue.offer("student3",3,TimeUnit.SECONDS);
         // , 3 
        abQueue.offer("student4",3,TimeUnit.SECONDS);
       } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
         }
       System.out.println(" ");
      });
      t1.start();
    
    // 
      Thread t2 = new Thread(()->{
       try {
        Thread.currentThread().sleep(2000L);//2 
        System.out.println(" ");
        System.out.println(" :"+abQueue.size());
        System.out.println(" :"+abQueue.poll());// student1
    // 4 
        Thread.currentThread().sleep(2000L);//2 
        System.out.println(" :"+abQueue.poll());
        System.out.println(" :"+abQueue.poll());
        System.out.println(" :"+abQueue.poll());
    System.out.println(" :"+abQueue.poll(3,TimeUnit.SECONDS));// 
        System.out.println(" ");
        } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
    });
    t2.start();
    }
    }
    
      
        
        
    
    
    

    非ブロックキュー
    public class ConcurrentLinkedQueueTest2 {
    public static void main(String[] args) {
    // 
       ConcurrentLinkedQueue linkedQueue = new ConcurrentLinkedQueue();
       // 3 
       linkedQueue.offer("student1");
       linkedQueue.offer("student2");
       linkedQueue.offer("student3");
    
    System.out.println(" :"+linkedQueue.size());
       //   ( )
       System.out.println("peek :"+linkedQueue.peek());
    System.out.println(" :"+linkedQueue.size());
       System.out.println("poll  :"+linkedQueue.poll());
       System.out.println(" :"+linkedQueue.size());
       }
       }
    
    
    

    Javaのスレッドプールシーンと利点Javaのスレッドプールシーン:シーンが最も多い同時フレームワークを運用し、非同期または同時実行タスクを必要とするほとんどのプログラム;(例:ドメイン名スキャン管理)メリット:第一に、リソース消費を削減します.作成したスレッドを再利用することで、スレッドの作成と破棄による消費量を削減します.第二に、応答速度を向上させる.タスクが到着すると、タスクはスレッドの作成まで待たずにすぐに3つ目を実行できます.スレッドの管理性を向上させます.スレッドは希少なリソースであり、無制限に作成すると、システムリソースが消費されるだけでなく、システムの安定性が低下し、スレッドプールを使用して統一的な割り当て、チューニング、監視が可能になります.しかし,スレッドプールを合理的に利用するには,その実現原理を手のひらで知らなければならない.
    スレッドプールの役割スレッドプールは、突然大量に爆発するスレッドのために設計され、限られたいくつかの固定スレッドが大量の操作サービスを提供することで、スレッドの作成と破棄に要する時間を短縮し、効率を向上させる.
    1つのスレッドの時間が非常に長い場合は、スレッドプールを使用する必要はありません(長時間操作できないのではなく、適切ではありません).さらに、スレッドプール内のスレッドの開始、停止、中止を制御することはできません.
    スレッドプールの分類
    Executorフレームワークの最上位実装は、ThreadPoolExecutorクラスExecutorsファクトリクラスで提供されるnewScheduledThreadPool、newFixedThreadPool、newCachedThreadPoolメソッドも、実はThreadPoolExecutorのコンストラクタパラメータが異なるだけです
    ThreadPoolExecutorスレッドプールの説明:
    1.corePoolSize:スレッドプールのコアスレッド数です.デフォルトでは、コアスレッドはアイドル状態であってもオンラインスレッドプールで生存します.2.maximumPoolSize:スレッドプールに収容できる最大スレッド数.アクティブなスレッドがこの数値に達すると、後続の新しいタスクがブロックされます.3.keepAliveTime非コアスレッドアイドル時のタイムアウト時間が長く、それを超えると非コアスレッドが回収されます.4.unit keepAliveTimeパラメータの時間単位.5.workQueue:実行前にタスクを保持するためのキュー.このキューは、executeメソッドによってコミットされたRunnableタスクのみを保持します.
    スレッドプールの4つの作成方法は、newCachedThreadPoolがキャッシュ可能なスレッドプールを作成し、スレッドプールの長さが処理の必要性を超えた場合、空きスレッドを柔軟に回収でき、回収できない場合は新しいスレッドを作成する4つのスレッドプールを提供します.ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
    新FixedThreadPoolは、スレッドの最大同時数を制御し、超過したスレッドがキュー内で待機する定長スレッドプールを作成します.
    新ScheduledThreadPoolは、タイミングおよび周期的なタスク実行をサポートする定長スレッドプールを作成します.
    新SingleThreadExecutorは、一意の作業スレッドのみでタスクを実行し、すべてのタスクが指定された順序(FIFO、LIFO、優先度)で実行されることを保証する単一スレッド化されたスレッドプールを作成します.
     
    public class CachePools {
     public static void main(String[] args) {
      ExecutorService es = Executors.newCachedThreadPool();
        for(int i =0;i<20;i++){
         final int temp=i;// 
         es.submit(()->{
          System.out.println(Thread.currentThread().getName()+" :"+temp);
         });
        }
        es.shutdown();
        }
        }
    
     
    public class FixedPools {
         public static void main(String[] args) {
         //  , 4 
          ExecutorService es = Executors.newFixedThreadPool(4);
          for(int i=0;i<10;i++){
           final int temp=i;
           es.submit(new Runnable(){
           @Override
        public void run() {
         System.out.println(Thread.currentThread().getName()+"task no"+temp);
         }
         });
         }
         
    es.shutdown();
    }
    }
    
    
     
    
    public class SchedulePools {
     public static void main(String[] args) {
     ScheduledExecutorService ScheduledEs = Executors.newScheduledThreadPool(3);
      SchedulePools x = new SchedulePools();
         MyRun r = x.new MyRun();
      System.out.println(" :");
      ScheduledEs.scheduleAtFixedRate(r, 2, 2, TimeUnit.SECONDS);
      }
    
    public class MyRun implements Runnable{
    @Override
      public void run() {
       System.out.println(" ");
       }
       }
    
    
      
    public class SingleThreadPools {
          public static void main(String[] args) {
          ExecutorService es = Executors.newSingleThreadExecutor(); 
          for(int i=0; i<100;i++){
           final int temp=i;
           es.submit(new Runnable(){
           @Override
        public void run() {
         System.out.println(Thread.currentThread().getName()+" ");
         }
         });
         }
    }
    }