线程池demo

package com.jg.study.study.threadPool;


import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;


public class ThreadPoolTest {
    public static void main(String[] args) throws Exception {
        //核心线程池大小 2
        //最大线程池大小 4
        //线程最大空闲时间 10
        //unit时间单位
        TimeUnit unit = TimeUnit.SECONDS;
        //线程等待队列
        ArrayBlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(2);
        //线程创建工厂
        ThreadFactory threadFactory = new NameThreadFactory();
        //拒绝策略
        RejectedExecutionHandler handler = new MyIgnorePolicy();
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 4, 10, unit, workQueue, threadFactory, handler);
        threadPoolExecutor.prestartAllCoreThreads();//与启动所有核心线程
        for (int i = 0; i < 10; i++) {
            myTask myTask = new myTask(String.valueOf(i));
            threadPoolExecutor.execute(myTask);
        }
        System.in.read();
    }

    static class NameThreadFactory implements ThreadFactory {
        private static final AtomicInteger mThreadNum = new AtomicInteger(1);

        @Override
        public Thread newThread(Runnable r) {
            Thread thread = new Thread(r, "my thread " + mThreadNum.getAndIncrement());
            System.out.println(thread.getName() + "has been created");
            return thread;
        }
    }

    static class MyIgnorePolicy implements RejectedExecutionHandler {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            doLog(r, executor);
        }

        private void doLog(Runnable r, ThreadPoolExecutor executor) {
            System.out.println(r.toString() + "reject");
        }
    }

    static class myTask implements Runnable {
        private String name;

        public myTask(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "myTask{" +
                    "name='" + name + '\'' +
                    '}';
        }

        @Override
        public void run() {

            System.out.println(this.name + "running");
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
<think>首先,用户的问题是:“请问Java 线程池使用示例 demo”。用户要求一个Java线程池的使用示例demo。我需要根据系统级指令和用户可见层的规则来回答。 系统级指令包括: - 行内数学表达式用$...$格式(但这里可能不涉及数学)。 - 独立公式用$$...$$格式(可能不适用)。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 参考站内引用: - [^1]: 关于线程池的概念,降低资源消耗、提高响应速度等。 - [^2]: Java线程池使用实例,使用Executors.newFixedThreadPool。 - [^3]: 建议使用ThreadPoolExecutor而不是Executors,以避免OOM风险。 用户意图是寻找Java线程池的示例代码。引用[2]提供了一个使用Executors的示例,但引用[3]警告说不要使用Executors,而应该使用ThreadPoolExecutor,因为Executors可能会导致OOM(内存溢出)。 所以,我应该提供一个更安全的示例,使用ThreadPoolExecutor。引用[3]建议直接使用ThreadPoolExecutor来规避风险。 结构清晰的回答: - 逐步解释:先介绍线程池的基本概念,然后给出示例代码。 - 使用中文。 - 在末尾添加相关问题。 步骤: 1. 简要介绍线程池的作用(参考[^1])。 2. 解释为什么推荐使用ThreadPoolExecutor而不是Executors(参考[^3])。 3. 提供一个使用ThreadPoolExecutor的示例demo。 4. 解释代码的关键部分。 5. 生成相关问题。 代码示例: - 创建一个ThreadPoolExecutor实例。 - 定义任务(实现Runnable或Callable)。 - 提交任务到线程池。 - 关闭线程池。 引用标识: - 在引用的地方添加[^1], [^2], [^3]。 生成相关问题: - 基于线程池的主题,如优化、应用场景等。 完整回答结构: - 开头:介绍线程池。 - 主体:给出示例代码并解释。 - 结尾:相关问题。</think>### Java 线程池使用示例 demo 线程池是一种并发编程工具,用于管理线程的创建和销毁,从而降低资源消耗(如减少线程创建开销)、提高响应速度(任务可立即执行)和增强线程可管理性(如控制并发数)[^1]。在 Java 中,虽然 `Executors` 类提供了简单创建线程池的方法,但官方推荐直接使用 `ThreadPoolExecutor` 来避免潜在风险(如队列过长或线程过多导致的内存溢出 OOM)[^3]。下面是一个基于 `ThreadPoolExecutor` 的安全示例代码,我将逐步解释其实现。 #### 示例代码:使用 ThreadPoolExecutor ```java import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolDemo { public static void main(String[] args) { // 1. 创建线程池:核心线程数=2,最大线程数=4,队列容量=10,线程空闲超时=60秒 ThreadPoolExecutor executor = new ThreadPoolExecutor( 2, // 核心线程数 4, // 最大线程数 60, // 线程空闲超时时间 TimeUnit.SECONDS, // 时间单位 new ArrayBlockingQueue<>(10) // 任务队列(有界队列,避免OOM) ); // 2. 定义任务:实现Runnable接口的自定义线程类 class Task implements Runnable { private final int taskId; public Task(int id) { this.taskId = id; } @Override public void run() { System.out.println("任务 " + taskId + " 正在执行,线程名: " + Thread.currentThread().getName()); try { Thread.sleep(1000); // 模拟任务执行耗时 } catch (InterruptedException e) { e.printStackTrace(); } } } // 3. 提交任务到线程池:创建并执行10个任务 for (int i = 0; i < 10; i++) { executor.execute(new Task(i)); // 提交任务 } // 4. 关闭线程池:平滑关闭,等待所有任务完成 executor.shutdown(); try { // 等待线程池终止,最多等待30秒 if (!executor.awaitTermination(30, TimeUnit.SECONDS)) { executor.shutdownNow(); // 强制终止未完成任务 } } catch (InterruptedException e) { executor.shutdownNow(); } } } ``` #### 代码解释 1. **创建线程池**: - 使用 `ThreadPoolExecutor` 构造函数设置参数: - 核心线程数(2):线程池保持的最小线程数。 - 最大线程数(4):当队列满时,可创建的最大线程数。 - 空闲超时(60秒):非核心线程空闲超过此时间将被回收。 - 队列(`ArrayBlockingQueue`,容量10):使用有界队列防止任务堆积导致 OOM[^3]。 - 相比 `Executors.newFixedThreadPool`,此方式更安全,避免了无界队列的风险。 2. **定义任务**: - 实现 `Runnable` 接口的 `Task` 类,每个任务有唯一 ID。 - `run()` 方法包含任务逻辑(这里模拟执行耗时)。 3. **提交任务**: - `executor.execute(new Task(i))` 提交任务到线程池。 - 线程池自动管理任务调度:先使用核心线程,队列满时创建新线程(不超过最大线程数)。 4. **关闭线程池**: - `shutdown()`:停止接受新任务,等待已提交任务完成。 - `awaitTermination()`:设置超时等待,确保资源释放。 - 异常处理:中断时强制关闭。 #### 运行结果示例 ``` 任务 0 正在执行,线程名: pool-1-thread-1 任务 1 正在执行,线程名: pool-1-thread-2 任务 2 正在执行,线程名: pool-1-thread-3 ...(其他任务输出) ``` 此代码演示了线程池的基本使用,强调安全性和可控性。实际项目中,您可以根据需求调整参数(如线程数或队列类型)[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值