百木园-与人分享,
就是让自己快乐。

线程池

线程池

概论

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。

线程池的好处

  • 降低资源的消耗

  • 提高响应速度

  • 方便管理

  • 总结:线程复用,可以控制最大线程数,方便管理

     

//线程池
/**线程池 三大方法   七大参数 四种拒绝方式
* 线程池的好处
* 1.降低资源的消耗
* 2.提高响应的速度
* 3.方便管理
* 线程复用,可以控制最大线程数,方便管理
* */
public class Demo01 {
   public static void main(String[] args) {
       /**
        * 线程池三大方法
        * 能够同时开启的线程数
        * 1.newSingleThreadExecutor() 创建一个单一线程
        *2.newFixedThreadPool(5) 创建一个固定线程,能够同时开启5条线程
        * 3.newCachedThreadPool() 遇强则强,主机的最大同时线程开启数
        */
       //ExecutorService service01= Executors.newSingleThreadExecutor();
       //ExecutorService service02 = Executors.newFixedThreadPool(5);
       ExecutorService service03 = Executors.newCachedThreadPool();
       try {
           for (int i = 1; i <=100 ; i++) {
               //使用了线程池后,通过线程池来创建线程
               service03.execute(()-> System.out.println(Thread.currentThread().getName()+\"线程创建成功\"));
          }
      } catch (Exception e) {
           e.printStackTrace();
      } finally {
           //使用线程池,在程序结束之前要关闭线程池
           service03.shutdown();
      }
  }
}

三大方法

  • newSingleThreadExecutor() 创建一个单一线程

  • newFixedThreadPool(5) 创建一个固定线程,能够同时开启5条线程

  • newCachedThreadPool() 遇强则强,主机的最大同时线程开启数

控制线程开启的线程数

七大参数

    public ThreadPoolExecutor(int corePoolSize,//核心线程池大小
                             int maximumPoolSize,//最大核心线程池大小
                             long keepAliveTime,//超时,没有调用就会释放
                             TimeUnit unit,//超时单位
                             BlockingQueue<Runnable> workQueue,//阻塞队列
                             ThreadFactory threadFactory,//线程工厂,创建线程的,一般不用动
                             RejectedExecutionHandler handler//拒绝策略
                            6) {
       if (corePoolSize < 0 ||
           maximumPoolSize <= 0 ||
           maximumPoolSize < corePoolSize ||
           keepAliveTime < 0)
           throw new IllegalArgumentException();
       if (workQueue == null || threadFactory == null || handler == null)
           throw new NullPointerException();
       this.acc = System.getSecurityManager() == null ?
               null :
               AccessController.getContext();
       this.corePoolSize = corePoolSize;
       this.maximumPoolSize = maximumPoolSize;
       this.workQueue = workQueue;
       this.keepAliveTime = unit.toNanos(keepAliveTime);
       this.threadFactory = threadFactory;
       this.handler = handler;
  }

四大拒绝策略

  • new ThreadPoolExecutor.AbortPolicy() //银行满了,还有人进来,不处理这个人,直接抛出异常

  • new ThreadPoolExecutor.CallerRunsPolicy()//哪来的去哪里

  • new ThreadPoolExecutor.DiscardPolicy() //队列满了,丢到任务,不会抛出异常

  • new ThreadPoolExecutor.DiscardOldestPolicy()//队列满了尝试和最早的线程竞争,成功进入,失败丢掉,也不会抛出异常

/** 四大拒绝策略
*1.new ThreadPoolExecutor.AbortPolicy() //银行满了,还有人进来,不处理这个人,直接抛出异常
*2.new ThreadPoolExecutor.CallerRunsPolicy()//哪来的去哪里
*3.new ThreadPoolExecutor.DiscardPolicy() //队列满了,丢到任务,不会抛出异常
*4.new ThreadPoolExecutor.DiscardOldestPolicy()//队列满了尝试和最早的线程竞争,成功进入,失败丢掉,也不会抛出异常
*/
public class Demo02 {
   public static void main(String[] args) {
       ExecutorService threadPool = new ThreadPoolExecutor(
               2,
               5,
               3,
               TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(3),
               Executors.defaultThreadFactory(),
               new ThreadPoolExecutor.DiscardOldestPolicy()
              );
       //最大承载数:Deque+Max
       for (int i = 1; i <=3; i++) {
         threadPool.execute(()-> {
             System.out.println(Thread.currentThread().getName()+\": \"+\"OK\");
        });
      }
      threadPool.shutdown();
  }
}

来源:https://www.cnblogs.com/wfy-studying/p/16165606.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 线程池

相关推荐

  • 暂无文章