并发编程-线程池

1.线程池概念

线程池的七个参数:

  • corePoolSize:核心线程数。线程池中始终保持的线程数量,即使它们处于空闲状态。超过这个数量的线程会根据需要创建。

  • maximumPoolSize:最大线程数。线程池中允许的最大线程数量。当任务数量超过核心线程数时,可以创建新的线程,直到达到这个最大值。

  • keepAliveTime:线程的最大空闲时间。超过这个时间后,空闲线程会被终止,直到线程数量减少到核心线程数。

  • unitkeepAliveTime 的时间单位(如 TimeUnit.SECONDSTimeUnit.MILLISECONDS 等)。

  • workQueue:用于存储待执行任务的阻塞队列。可以是不同类型的队列,如 LinkedBlockingQueueArrayBlockingQueueSynchronousQueue 等。

  • handler:拒绝策略。当线程池无法处理更多任务时,决定如何处理新提交的任务。可以选择的策略包括:

    • AbortPolicy(默认)
    • CallerRunsPolicy
    • DiscardPolicy
    • DiscardOldestPolicy
  • threadFactory(可选):用于创建新线程的工厂。可以自定义线程的名称、优先级等属性。

补充: 

* 默认 拒绝策略是 AbortPolicy,直接抛出异常RejectedExecutionException
* DiscardPolicy 直接丢弃任务
* DiscardOldestPolicy 丢弃阻塞队列中最早的任务
* CallerRunsPolicy 由调用者线程执行任务
*
* 默认 阻塞队列 是 LinkedBlockingQueue 由链表结构组成的有界阻塞队列
* ArrayBlockingQueue 由数组结构组成的有界阻塞队列
* PriorityBlockingQueue 支持优先级排序的无界阻塞队列
* SynchronousQueue 不存储元素的阻塞队列
*
* 可省项:线程工厂 和 拒绝策略

2.线程池Demo

2.1线程工厂(可省项)

/**
 * 线程工厂
 */
public class MyThreadFactory implements ThreadFactory {
    private int threadNum = 0;
    /**
     * 在这里可以 定义线程 的 name,和线程的其他属性
     * @param r a runnable to be executed by new thread instance
     * @return
     */
    @Override
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r);
        thread.setName("myThread - " + threadNum);
        threadNum++;
        return thread;
    }
}

2.2Runnable任务

/**
 * Runnable 任务 重写run方法
 */
public class TaskRunnableWithTimeSleep implements Runnable{
    private String taskName;

    public TaskRunnableWithTimeSleep() {
    }

    TaskRunnableWithTimeSleep(String name){
        taskName = name;
    }
    @Override
    public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(Thread.currentThread().getName() + " 执行  " + taskName + " 方法,没有返回值");
    }
}

2.3线程池测试类

public class Main01 {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                4,// 核心线程数
                5,// 最大核心线程数
                10,// 临时线程的存活时间
                TimeUnit.MILLISECONDS,// 时间单位
                new ArrayBlockingQueue<>(2),// 阻塞队列可以存储两个任务
                new MyThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );

        // 模拟同时执行 10 个任务
        for (int i = 0; i < 10; i++) {
            threadPoolExecutor.execute(new TaskRunnableWithTimeSleep("任务" + i));
        }

        threadPoolExecutor.shutdown();
    }
}

2.4执行结果

当前设置最大线程数为5,阻塞队列大小为2;模拟同时执行10个任务,由于拒绝策略是AbortPolicy(阻塞队列为满,则直接抛出异常)。所以结果抛出异常,然后执行了7个任务 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值