zoukankan      html  css  js  c++  java
  • 线程池

    线程池:

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

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

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

         定时执行、定期执行

    线程池所在包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+"执行完毕");  

      }

    }

  • 相关阅读:
    defineProperty的使用
    js题库全集
    如何将多个文件夹中的文件合并到一个文件夹中
    CYQ.Data V5 MDataTable 专属篇介绍
    读取和写入配置文件内容的方法
    面对代码中过多的if...else的解决方法
    SQL语句--删除掉重复项只保留一条
    获取当前时间
    Stopwatch 类用于计算程序运行时间
    正则表达式手册
  • 原文地址:https://www.cnblogs.com/shmilynanmei/p/9019832.html
Copyright © 2011-2022 走看看