线程池大类之WorkStealingPool

本文介绍了Java中的WorkStealingPool线程池,展示了如何创建和使用它来执行并发任务,重点在于守护线程和任务调度。通过实例演示了其工作原理和输出结果。
								           线程池大类之WorkStealingPool
package src.main.java.com.qqjx.thread;

/*
 * @Auther  wangpeng
 * @Date 2021/2/6
 */

import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class T11_WorkStealingPool {
    public static void main(String[] args) throws IOException {
        ExecutorService service = Executors.newWorkStealingPool();
        System.out.println(Runtime.getRuntime().availableProcessors());

        service.execute(new R(1000));
        service.execute(new R(2000));
        service.execute(new R(2000));
        service.execute(new R(2000)); //daemon
        service.execute(new R(2000));

        //由于产生的是精灵线程(守护线程、后台线程),主线程不阻塞的话,看不到输出
        System.in.read();
    }

    static class R implements Runnable {

        int time;

        R(int t) {
            this.time = t;
        }

        @Override
        public void run() {

            try {
                TimeUnit.MILLISECONDS.sleep(time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(time  + " " + Thread.currentThread().getName());

        }

    }
}
6
1000 ForkJoinPool-1-worker-1
2000 ForkJoinPool-1-worker-3
2000 ForkJoinPool-1-worker-4
2000 ForkJoinPool-1-worker-2
2000 ForkJoinPool-1-worker-5

Java 的 `Executors` 工具类提供了多种创建线程池的静态工厂方法,用于简化 `ThreadPoolExecutor` 的配置。以下是常用的方法及其特点: --- ### **1. 固定大小线程池 (`newFixedThreadPool`)** ```java ExecutorService fixedThreadPool = Executors.newFixedThreadPool(int nThreads); ``` - **特点**: - 线程池中保持固定数量的核心线程(`nThreads`),即使线程空闲也不会被回收。 - 任务队列使用无界的 `LinkedBlockingQueue`,可能导致内存溢出(OOM)。 - **适用场景**: 适合已知并发量且需要严格控制线程数的任务(如服务器请求处理)。 --- ### **2. 单线程池 (`newSingleThreadExecutor`)** ```java ExecutorService singleThreadPool = Executors.newSingleThreadExecutor(); ``` - **特点**: - 只有一个线程按顺序执行任务。 - 同样使用无界队列,存在 OOM 风险。 - **适用场景**: 需要保证任务顺序执行的场景(如日志写入、异步事件队列)。 --- ### **3. 可缓存线程池 (`newCachedThreadPool`)** ```java ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); ``` - **特点**: - 线程数量根据任务动态增减(空闲线程默认 60 秒回收)。 - 任务队列使用 `SynchronousQueue`(直接移交任务,不存储)。 - 可能创建大量线程导致资源耗尽。 - **适用场景**: 短生命周期的异步任务(如 HTTP 请求响应)。 --- ### **4. 定时任务线程池 (`newScheduledThreadPool`)** ```java ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(int corePoolSize); ``` - **特点**: - 支持定时或周期性任务(如 `scheduleAtFixedRate`)。 - 核心线程数固定,但非核心线程可无限创建(依赖任务频率)。 - **适用场景**: 定时任务(如心跳检测、数据同步)。 --- ### **5. 工作窃取线程池 (`newWorkStealingPool`)(Java 8+)** ```java ExecutorService workStealingPool = Executors.newWorkStealingPool(int parallelism); ``` - **特点**: - 基于 ForkJoinPool 实现,使用工作窃取(Work-Stealing)算法提高并行效率。 - 默认并行度为 CPU 核心数。 - **适用场景**: 计算密集型任务(如分治算法、并行流处理)。 --- ### **注意事项** 1. **无界队列风险**: `FixedThreadPool` 和 `SingleThreadPool` 使用无界队列,任务堆积可能导致 OOM。 2. **资源耗尽风险**: `CachedThreadPool` 可能创建过多线程,需谨慎使用。 3. **推荐替代方案**: 直接使用 `ThreadPoolExecutor` 构造函数,明确指定队列类型和拒绝策略。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值