四种常见的线程池

本文介绍了Java中的四种主要线程池:newSingleThreadExecutor(保证任务顺序执行)、newFixedThreadPool(限制并发数)、newScheduledThreadPool(定时/周期任务)、newCachedThreadPool(动态扩展)。每个线程池的特点和适用场景都被详细解释并配以代码示例。
摘要由CSDN通过智能技术生成

Java中四种常见的线程池包括newSingleThreadExecutor、newFixedThreadPool、newScheduledThreadPool和newCachedThreadPool

  • newSingleThreadExecutor创建一个单线程的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定的顺序(FIFO, LIFO, 优先级)执行。这种线程池适用于需要保证任务顺序执行的场景。

public class SingleThreadExecutorExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();

        // 提交任务到线程池
        executor.submit(() -> {
            System.out.println("Task 1 is running");
        });

        executor.submit(() -> {
            System.out.println("Task 2 is running");
        });

        // 关闭线程池
        executor.shutdown();
    }
}

 newSingleThreadExecutor

  ThreadPoolExecutor executor = new ThreadPoolExecutor
(1, 1, 0L, 
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(), 
threadFactory);

核心线程数(corePoolSize)1

最大线程数(maximumPoolSize) 1

空闲线程存活时间(keepAliveTime) 0

时间单位(TimeUnit)纳秒

任务队列(workQueue) LinkedBlockingQueue(无界队列)

  • newFixedThreadPool创建一个定长线程池,可以控制线程的最大并发数,超出的线程会在队列中等待。这种线程池适用于需要限制并发线程数量的场景,以避免过多的线程竞争资源导致系统负载过高

public class FixedThreadPoolExample {
    public static void main(String[] args) {
        int numberOfThreads = 5; // 设置最大并发数为5
        ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);

        for (int i = 0; i < 10; i++) {
            executor.submit(() -> {
                System.out.println("Task " + i + " is running");
            });
        }

        // 关闭线程池
        executor.shutdown();
    }
}

 newFixedThreadPool

ThreadPoolExecutor executor = new ThreadPoolExecutor
(5, 5, 0L, 
TimeUnit.MILLISECONDS, 
new LinkedBlockingQueue<Runnable>(), 
threadFactory);

核心线程数(corePoolSize)用户指定

最大线程数(maximumPoolSize)   = 核心线程数(corePoolSize)

空闲线程存活时间(keepAliveTime) 0

时间单位(TimeUnit)毫秒

任务队列(workQueue) LinkedBlockingQueue(无界队列)

  • newScheduledThreadPool创建一个可定期或延时执行任务的定长线程池,支持定时及周期性任务执行。这种线程池适用于需要定时或周期性执行任务的场景,如定时清理缓存、定时发送心跳包等。

public class ScheduledThreadPoolExample {
    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);

        // 延迟2秒后执行任务
        executor.schedule(() -> {
            System.out.println("Task 1 is running after 2 seconds");
        }, 2, TimeUnit.SECONDS);

        // 每隔3秒执行一次任务
        executor.scheduleAtFixedRate(() -> {
            System.out.println("Task 2 is running every 3 seconds");
        }, 0, 3, TimeUnit.SECONDS);

        // 关闭线程池
        executor.shutdown();
    }
}

 newScheduledThreadPool

public ScheduledThreadPoolExecutor(int corePoolSize) {super
(corePoolSize, 
Integer.MAX_VALUE,
 0, NANOSECONDS,
new DelayedWorkQueue());
}

核心线程数(corePoolSize)指定的线程数

最大线程数(maximumPoolSize) Integer.MAX_VALUE, 无限大

空闲线程存活时间(keepAliveTime) 0

时间单位(TimeUnit)纳秒

任务队列(workQueue) DelayedWorkQueue

  • newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可以灵活回收空闲线程,若无可回收,则新建线程。这种线程池适用于任务执行时间较短且频繁创建线程的场景,如Web服务器处理用户请求

public class CachedThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newCachedThreadPool();

        for (int i = 0; i < 10; i++) {
            executor.submit(() -> {
                System.out.println("Task " + i + " is running");
            });
        }

        // 关闭线程池
        executor.shutdown();
    }
}

newCachedThreadPool

ThreadPoolExecutor executor = new ThreadPoolExecutor
(0, Integer.MAX_VALUE, 60L, 
TimeUnit.SECONDS, 
new SynchronousQueue<Runnable>(),
threadFactory);

核心线程数(corePoolSize)0

最大线程数(maximumPoolSize) Integer.MAX_VALUE  

空闲线程存活时间(keepAliveTime) 60

时间单位(TimeUnit)

任务队列(workQueue) SynchronousQueue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值