• java多线程之 Executors线程池管理


    1.  Executors
    此类中提供的一些方法有:
    1.1 public static ExecutorService newCachedThreadPool()
    创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。
     
    1.2 public static ExecutorService newFixedThreadPool(int nThreads)
    创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
     
    1.3 public static ExecutorService newSingleThreadExecutor()
    创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
     
    这三个方法都可以配合接口ThreadFactory的实例一起使用。并且返回一个ExecutorService接口的实例。
    2. 接口 ThreadFactory
    根据需要创建新线程的对象。使用线程工厂就无需再手工编写对 new Thread 的调用了,从而允许应用程序使用特殊的线程子类、属性等等。
    此接口最简单的实现就是:
    class SimpleThreadFactory implements ThreadFactory {
       public Thread newThread(Runnable r) {
         return new Thread(r);
       }
     }
    3. 接口ExecutorService
    该接口提供了管理终止的方法。
    4.测试用例:
      4.1固定大小线程:
    代码 
    
    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 import java.util.concurrent.ExecutorService;
     import java.util.concurrent.Executors;
     
     /**
      * 
      * @author hxm
      *
      */
     public class TestThread {
         public static void main(String args[]){
             //创建一个可重用固定线程数的线程池
             ExecutorService pool = Executors.newFixedThreadPool(4);
             
             //创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
     //        ExecutorService pool = Executors.newSingleThreadExecutor();
             //创建实现了runnable接口的对象
             Thread t1 = new MyThread();
             Thread t2 = new MyThread();
             Thread t3 = new MyThread();
             Thread t4 = new MyThread();
             Thread t5 = new MyThread();
             //将线程放入池中进行执行
             pool.execute(t1);
             pool.execute(t2);
             pool.execute(t3);
             pool.execute(t4);
             pool.execute(t5);
             //关闭线程池
             pool.shutdown();
         }
     }
      class MyThread extends Thread{
          
          @Override
          public void run(){
              System.out.println(Thread.currentThread().getName()+" is running...");
          }
      }
    View Code

      4.2单任务线程:

    package cn.itcast.heima2;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    
    public class ThreadPoolTest {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            //创建一个线程池
    //        ExecutorService threadPool = Executors.newFixedThreadPool(3);//创建3个线程
    //        ExecutorService threadPool = Executors.newCachedThreadPool();
            ExecutorService threadPool = Executors.newSingleThreadExecutor();
            for(int i=1;i<=10;i++){
                final int task = i;
                //往线程池里面添加任务
                threadPool.execute(new Runnable(){
                    @Override
                    public void run() {
                        for(int j=1;j<=10;j++){
                            try {
                                Thread.sleep(20);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            System.out.println(Thread.currentThread().getName() + " is looping of " + j + " for  task of " + task);
                        }
                    }
                });
            }
            System.out.println("all of 10 tasks have committed! ");
            //定时器
            Executors.newScheduledThreadPool(3).scheduleAtFixedRate(
                    new Runnable(){
                        @Override
                    public void run() {
                        System.out.println("bombing!");
                        
                    }},
                    6,
                    2,
                    TimeUnit.SECONDS);
        }
    
    }
    View Code

      4.3 单任务延迟线程:

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    /**
     * 
     * @author hxm
     *
     */
    public class TestThread {
        public static void main(String args[]){
            //创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行
            ScheduledExecutorService pool = Executors.newSingleThreadScheduledExecutor();
            //创建实现了runnable接口的对象
            Thread t1 = new MyThread();
            Thread t2 = new MyThread();
            Thread t3 = new MyThread();
            Thread t4 = new MyThread();
            Thread t5 = new MyThread();
            //将线程放入池中进行执行
            pool.execute(t1);
            pool.execute(t2);
            pool.execute(t3);
             //使用延迟执行风格的方法 
            pool.schedule(t4, 10, TimeUnit.MILLISECONDS); 
            pool.schedule(t5, 10, TimeUnit.MILLISECONDS); 
    
            //关闭线程池
            pool.shutdown();
        }
    }
     class MyThread extends Thread{
         
         @Override
         public void run(){
             System.out.println(Thread.currentThread().getName()+" is running...");
         }
     }
    View Code

      4.4 自定义线程池:

     import java.util.concurrent.ArrayBlockingQueue;
     2 import java.util.concurrent.BlockingQueue;
     3 import java.util.concurrent.ExecutorService;
     4 import java.util.concurrent.Executors;
     5 import java.util.concurrent.ScheduledExecutorService;
     6 import java.util.concurrent.ThreadPoolExecutor;
     7 import java.util.concurrent.TimeUnit;
     8 
     9 /**
    10  * 
    11  * @author hxm
    12  *
    13  */
    14 public class TestThread {
    15     public static void main(String args[]){
    16           //创建等待队列 
    17         BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>(20); 
    18         //创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。 
    19         ThreadPoolExecutor pool = new ThreadPoolExecutor(2,3,2,TimeUnit.MILLISECONDS,bqueue); 
    20 
    21         //创建实现了runnable接口的对象
    22         Thread t1 = new MyThread();
    23         Thread t2 = new MyThread();
    24         Thread t3 = new MyThread();
    25         Thread t4 = new MyThread();
    26         Thread t5 = new MyThread();
    27         //将线程放入池中进行执行
    28         pool.execute(t1);
    29         pool.execute(t2);
    30         pool.execute(t3);
    31         pool.execute(t4);
    32         pool.execute(t5);
    33         //关闭线程池
    34         pool.shutdown();
    35     }
    36 }
    37  class MyThread extends Thread{
    38      
    39      @Override
    40      public void run(){
    41          System.out.println(Thread.currentThread().getName()+" is running...");
    42     try { 
    43          Thread.sleep(100L); 
    44      } catch (InterruptedException e) { 
    45              e.printStackTrace(); 
    46      } 
    47      }
    48  }
    View Code
  • 相关阅读:
    PAT (Advanced Level) Practice 1129 Recommendation System (标记+排序)
    PAT (Advanced Level) Practice 1135 Is It A Red-Black Tree (30分) (红黑树知识+建树+判断)
    PAT (Advanced Level) Practice 1134 Vertex Cover (25分) (存边+标记点!!)
    PAT (Advanced Level) Practice 1133 Splitting A Linked List (25分) (静态链表的遍历)
    PAT (Advanced Level) Practice 1139 First Contact (30分) (unordered_map用来标记+哈希)
    PAT (Advanced Level) Practice 1132 Cut Integer (20分) (atoi、stoi区别、stringstream使用)
    PAT (Advanced Level) Practice 1138 Postorder Traversal (25分) (不键树、法一找规律法二先序中序变后序)
    区间DP学习 LibreOJ-10147 石子合并
    2020 Nowcoder Training
    UVA1347 Tour 动态规划
  • 原文地址:https://www.cnblogs.com/lbangel/p/3186478.html
Copyright © 2020-2023  润新知