线程池的创建

介绍几种常见的线程池

引言

ExecutorService 是java提供的管理线程池的类。主要用于控制线程的数量和重用线程。常用的线程池的参数:
corePoolSize :线程池的大小
maximumPoolSize:创建线程的最大数量
keepAliveTime :设置空闲线程的销毁时间
workQueue:阻塞队列,用来存储等待执行的任务决定了线程池的排队策略。主要取值:
ArrayBlockingQueue; 阻塞顺序队列
LinkedBlockingQueue; 基于链表实现的阻塞队列
SynchronousQueue;他实际上不是一个真正的队列,他不会为对中的元素维护存储空间
threadFactory 线程工厂,是用来创建线程的。

简单的创建一个线程池测试一下,这是一个可缓存的线程池。线程池为很大,当执行当前任务时上一个任务已经完成,会复用执行上一个任务的线程,而不用每次新建线程。

   public static void main(String[] args) {

        //创建一个可缓存的线程池
        ExecutorService executorService = Executors.newCachedThreadPool();

        for (int i = 0; i < 100; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //使用线程池的线程
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    //打印正在执行的信息
                    System.out.println(Thread.currentThread().getName()+"正在执行");
                }
            });
        }

    }

创建一个可重用固定个数的线程池来测试一下
这里设置的线程的大小为3.

 public static void main(String[] args) {

     //创建一个可缓存的线程池
     ExecutorService executorService = Executors.newFixedThreadPool(3);

     for (int i = 0; i < 100; i++) {
         try {
             executorService.execute(new Runnable() {
                 @Override
                 public void run() {
                     //打印正在执行的信息
                     System.out.println(Thread.currentThread().getName()+"正在执行");
                 }
             });
             Thread.sleep(1000);
         } catch (InterruptedException e) {
             e.printStackTrace();
         }

         //使用线程池的线程

     }

 }
/*
 //执行结果
>   pool-1-thread-1正在执行
 	pool-1-thread-2正在执行
 	pool-1-thread-3正在执行
 	pool-1-thread-1正在执行
 	pool-1-thread-2正在执行
 	pool-1-thread-3正在执行
 	pool-1-thread-1正在执行
 	pool-1-thread-2正在执行
 	pool-1-thread-3正在执行
 	pool-1-thread-1正在执行
 	pool-1-thread-2正在执行
 	pool-1-thread-3正在执行
 	pool-1-thread-1正在执行
 	pool-1-thread-2正在执行
*/    

设置一个定长的线程池,支持定时,及周期性任务的执行。

    public static void main(String[] args) {
       //设置线程池大小为5
       ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
   	//延迟5秒执行
       scheduledExecutorService.schedule(new Runnable() {
           @Override
           public void run() {
               System.out.println("延迟5秒执行");
           }
       },5, TimeUnit.SECONDS);
   }

   //设置执行周期
   public static void main(String[] args) {
       //设置线程池大小为5
       ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);

       //延迟1秒每四秒执行一次
       scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
           @Override
           public void run() {
               System.out.println(Thread.currentThread().getName()+": 延迟1秒每4秒执行一次");
           }
       },1, 4, TimeUnit.SECONDS);
   }
   /*
   执行结果
   pool-1-thread-1: 延迟1秒每4秒执行一次
   pool-1-thread-1: 延迟1秒每4秒执行一次
   pool-1-thread-2: 延迟1秒每4秒执行一次
   pool-1-thread-1: 延迟1秒每4秒执行一次
   */
  

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务.使用
Executors.newSingleThreadExecutor()来创建。这个就是按照任务的执行顺序来进行的。

  public static void main(String[] args) {

     //创建一个单线程化的线程池
     ExecutorService scheduledExecutorService = Executors.newSingleThreadExecutor();

     for (int i = 0; i < 10; i++) {
         int index = i;
         scheduledExecutorService.execute(new Runnable() {
             @Override
             public void run() {
                 //输出当前线程的执行
                 try {
                     System.out.println(Thread.currentThread().getName()+"正在执行"+index);
                     Thread.sleep(1);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         });
     }


 }
 /*
 pool-1-thread-1正在执行0
 pool-1-thread-1正在执行1
 pool-1-thread-1正在执行2
 pool-1-thread-1正在执行3
 pool-1-thread-1正在执行4
 pool-1-thread-1正在执行5
 pool-1-thread-1正在执行6
 pool-1-thread-1正在执行7
 pool-1-thread-1正在执行8
 pool-1-thread-1正在执行9
 */

总结

先了解怎么创建再说吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值