• 线程池


    线程池:

    因为线程缺乏统一管理,占用过多系统资源,缺乏更多功能,如定时执行、定期执行等

    好处:  重用存在的线程,减少对象创建,消亡的开销。

         有效控制最大并发数,提高系统资源使用率

         定时执行、定期执行

    线程池所在包java.util.concurrent

    顶级接口是Executor,真正的线程池接口是ExecutorService

    java,util.Executors类提供创建线程池的方法

    这些全是Executors的构造方法

    newCachedThreadPool()            创建一个可缓存的线程池,有任务时才创建任务

    newSingleThreadExecutor()             创建一个单线程池

    newFixedThreadPool(int  nThreads)        创建一个固定长度的线程池,空闲线程会一直保留,参数nThreads设定线程池中线程的数目

    newScheduledThreadPool(int  corePoolSize )   创建了一个固定的线程池,而且以延迟或定时的方式来执行任务,参数是最大的线程数,而且这个对应的是ScheduledExecutorService这个类去接收

    案例1:这个案例可以使用前三个构造方法newCachedThreadPool()、newSingleThreadExecutor()、newFixedThreadPool(int  nThreads)

    package cn.lnm.exp2;

    import java.util.concurrent.ExecutorService;

    import java.util.concurrent.Executors;

    public class MyThreadDemo {

    /**  

    * @param args  

    */

    public static void main(String[] args) { 

      ExecutorService es=Executors.newCachedThreadPool();  

      for (int i = 0; i < 10; i++) {   

        es.execute(new MineThread(i));   

      try {    

        Thread.sleep(100);  

      } catch (InterruptedException e) {    

        e.printStackTrace();   

        } 

      }

     }

    }

    class MineThread implements Runnable{ 

      int num;  

        public MineThread(int num) {       

        super();     

        this.num = num;   

       }

      @Override 

      public void run() {  

        System.out.println(Thread.currentThread().getName()+":"+num); 

      }  

     }

    案例2:这个案例对应的是ScheduledExecutorService这个类去接收

    package cn.lnm.exp2;

    import java.util.concurrent.Executors;

    import java.util.concurrent.ScheduledExecutorService;

    import java.util.concurrent.TimeUnit;

    public class MyThreadDemo {

    /**  

    * @param args 

    */ 

      public static void main(String[] args) { 

         ScheduledExecutorService es = Executors.newScheduledThreadPool(3);// 里面的参数是最大的线程数  

         System.out.println("**************");  

         es.scheduleAtFixedRate(new MineThread(), 1, 2, TimeUnit.SECONDS);

       }

    }

    class MineThread implements Runnable { 

      @Override 

      public void run() {  

        System.out.println(Thread.currentThread().getName()+"延时1秒执行,每2秒执行一次"); 

      }

    }

    ThreadPoolExecutor:创建一个自定义线程池

    构造器中各个参数的含义:

    corePoolSize        核心池的大小

    maximumPoolSize       线程池最大线程数

    keepAliveTime        表示线程没有任务执行时最多保持多篇时间会终止

    unit             参数keepAliveTime的时间单位,使用TimeUnit这个枚举去设置是秒否是毫秒

    workQueue           一个阻塞队列,用来存储等待执行的任务的大小(就像去医院排队看病,可以在外面等待的病人总人数)

    threadFactory         线程工厂,主要用来创建线程

    handler            表示当拒绝处理任务的策略

    案例3:这个代码执行到第12条信息的时候,会报错,因为这个线程池的大小,一个是执行的线程池5,一个是最大可以有7条线程池,然后可以排队的线程池是4,一共可以有11条线程,然后第12条的时候,处理不了,直接拒绝了这条线程,所以会报异常

    package cn.lnm.exp2;

    import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit;

    public class MyThreadDemo {

     /**  

    * @param args  

    */  

      public static void main(String[] args) {   

        //创建一个自定义线程池      

        ThreadPoolExecutor tpe=new ThreadPoolExecutor(5, 7, 300, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(4));  

         for (int i = 1; i <= 12; i++) {    

          tpe.execute(new MineThread(i));    

          System.out.println("线程池中线程数:"+tpe.getPoolSize()+",队列中等待执行的任务数"+tpe.getQueue().size()+",已经执行完的任务数"+tpe.getCompletedTaskCount());  

         }   

        tpe.shutdown();//关闭线程池

       }

    }

    class MineThread implements Runnable {  

      int num;  

      public MineThread(int num) {   

        super();   

        this.num = num;

       }  

    @Override  

    public void run() {   

      System.out.println("正在执行任务"+num);   

      try {    

        Thread.sleep(2000);  

       } catch (InterruptedException e) {    

        e.printStackTrace();   

      }  

      System.out.println("任务"+num+"执行完毕");  

      }

    }

  • 相关阅读:
    HDU-3065-病毒侵袭持续中(AC自动机)
    HDU-2896-病毒侵袭(AC自动机)
    HDU
    Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) D. Sequence Sorting
    Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) B. Strings Equalization
    Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) C. Save the Nature
    Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) A. CME
    Codeforces Round #586 (Div. 1 + Div. 2) E. Tourism
    Codeforces Round #586 (Div. 1 + Div. 2) D. Alex and Julian
    jsp内置对象
  • 原文地址:https://www.cnblogs.com/shmilynanmei/p/9019832.html
Copyright © 2020-2023  润新知