常见线程池类型与应用场景

2023年 11月 24日 96.9k 0

在java.util.concurrent.Executors类中提供了大量创建连接池的静态方法,常见就有四种。

图片[1]-常见线程池类型与应用场景-不念博客

  • 创建使用固定线程数的线程池
  •  public static ExecutorService newFixedThreadPool(int nThreads) {
            return new ThreadPoolExecutor(nThreads, 
                                          0L, 
                                          TimeUnit.MILLISECONDS, 
                                          new LinkedBlockingQueue());
        }
    • 核心线程数与最大线程数一样,没有救急线程
    • 阻塞队列是LinkedBlockingQueue,最大容量为Integer.MAX_VALUE
    • 适用场景:适用于任务量已知,相对耗时的任务
    • 案例
    /**
     * @author springboot葵花宝典
     * @description: TODO
     */
    public class FixedThreadPoolTest {
    
        static class FixedThreadDemo implements Runnable{
            @Override
            public void run() {
                String name = Thread.currentThread().getName();
                for (int i = 0; i < 2; i++) {
                    System.out.println(name + ":" + i);
                }
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            //创建一个固定大小的线程池,核心线程数和最大线程数都是3
            ExecutorService executorService = Executors.newFixedThreadPool(3);
    
            for (int i = 0; i < 5; i++) {
                executorService.submit(new FixedThreadDemo());
                Thread.sleep(10);
            }
    
            executorService.shutdown();
        }
    
    }
    

    2.单线程化的线程池,它只会用唯一的工作线程来执行任 务,保证所有任务按照指定顺序(FIFO)执行

    public static ExecutorService newSingleThreadExecutor() {
            return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 
            1, 
            0L,
            TimeUnit.MILLISECONDS, 
            new LinkedBlockingQueue()));
        }
    • 核心线程数和最大线程数都是1
    • 阻塞队列是LinkedBlockingQueue,最大容量为Integer.MAX_VALUE
    • 适用场景:适用于按照顺序执行的任务
    • 案例
    /**
     * @author springboot葵花宝典
     * @description: TODO
     */
    public class NewSingleThreadTest {
        static int count = 0;
    
        static class Demo implements Runnable {
            @Override
            public void run() {
                count++;
                System.out.println(Thread.currentThread().getName() + ":" + count);
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            //单个线程池,核心线程数和最大线程数都是1
            ExecutorService exec = Executors.newSingleThreadExecutor();
    
            for (int i = 0; i < 10; i++) {
                exec.execute(new Demo());
                Thread.sleep(5);
            }
            exec.shutdown();
        }
    }
  • 可缓存线程池
  • public static ExecutorService newCachedThreadPool() {
            return new ThreadPoolExecutor(0,
                                        Integer.MAX_VALUE, 
                                        60L,
                                        TimeUnit.SECONDS, n
                                        ew SynchronousQueue());
        }
    • 核心线程数为0
    • 最大线程数是Integer.MAX_VALUE
    • 阻塞队列为SynchronousQueue:不存储元素的阻塞队列,每个插入操作都必须等待一个移出操作
    • 适用场景:适合任务数比较密集,但每个任务执行时间较短的情况
    • 案例:
    /**
     * @author springboot葵花宝典
     * @description: TODO
     */
    public class CachedThreadPoolTest {
        static class Demo implements Runnable {
            @Override
            public void run() {
                String name = Thread.currentThread().getName();
                try {
                    //修改睡眠时间,模拟线程执行需要花费的时间
                    Thread.sleep(100);
    
                    System.out.println(name + "执行完了");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            //创建一个缓存的线程,没有核心线程数,最大线程数为Integer.MAX_VALUE
            ExecutorService exec = Executors.newCachedThreadPool();
            for (int i = 0; i < 10; i++) {
                exec.execute(new Demo());
                Thread.sleep(1);
            }
            exec.shutdown();
        }
    }

    4.提供了“延迟”和“周期执行”功能的ThreadPoolExecutor

    public ScheduledThreadPoolExecutor(int corePoolSize,
                                       ThreadFactory threadFactory,
                                       RejectedExecutionHandler handler{
     super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue(), threadFactory, handler);                     
    }
    • 适用场景:有定时和延迟执行的任务
    • 案例
    /**
     * @author springboot葵花宝典
     * @description: TODO
     */
    public class ScheduledThreadPoolTest {
        static class Task implements Runnable {
            @Override
            public void run() {
                try {
                    String name = Thread.currentThread().getName();
    
                    System.out.println(name + ", 开始:" + new Date());
                    Thread.sleep(1000);
                    System.out.println(name + ", 结束:" + new Date());
    
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            //按照周期执行的线程池,核心线程数为2,最大线程数为Integer.MAX_VALUE
            ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);
            System.out.println("程序开始:" + new Date());
    
            /**
             * schedule 提交任务到线程池中
             * 第一个参数:提交的任务
             * 第二个参数:任务执行的延迟时间
             * 第三个参数:时间单位
             */
            scheduledThreadPool.schedule(new Task(), 0, TimeUnit.SECONDS);
            scheduledThreadPool.schedule(new Task(), 1, TimeUnit.SECONDS);
            scheduledThreadPool.schedule(new Task(), 5, TimeUnit.SECONDS);
    
            Thread.sleep(5000);
    
            // 关闭线程池
            scheduledThreadPool.shutdown();
    
        }
    }
    

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论