线程池和自定义线程池

多线程的弊端

线程池

线程池主要核心原理


  • 创建一个池子,池子中是空的
  • 提交任务时,池子会创建新的线程对象,任务执行完毕,线程归还给池子下回再次提交任务时,不需要创建新的线程,直接复用已有的线程即可
  • 但是如果提交任务时,池子中没有空闲线程,也无法创建新的线程,任务就会排队等待

线程池代码实现

1,创建线程池

package multithread.threadpools.pool1;

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            System.out.println(Thread.currentThread().getName() + "--" + i);
        }
    }
}

2,提交任务

package multithread.threadpools.pool1;


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class pool {
    public static void main(String[] args) {
        //1.获取线程池对象
        ExecutorService pool = Executors.newCachedThreadPool();

        //提交任务
        pool.submit(new MyRunnable());

        //销毁线程池
        pool.shutdown();
    }
}

3,所有的任务全部执行完毕,关闭线程池

自定义线程池

自定义线程池(任务拒绝策略)

线程池小结

### Java 默认线程池自定义线程池 #### 默认线程池的使用方式 Java 提供了 `Executors` 工厂类用于快速创建几种常见的线程池。这些预定义的线程池适用于特定类型的并发需求。 - **Fixed Thread Pool** 创建具有固定数量工作线程的线程池。当所有线程都在忙碌状态时,新任务将在队列中等待直到有空闲线程处理它们。 ```java ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10); ``` - **Cached Thread Pool** 这种线程池会根据需要创建新的线程,但在先前构建的线程可用时将重用它们。对于执行大量短期异步任务的应用程序非常有用。 ```java ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); ``` - **Scheduled Thread Pool** 支持延迟和定期执行任务的功能。可以用来安排命令在未来某个时间点运行一次或重复多次。 ```java ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); ``` - **Single Thread Executor** 只有一个工作者线程;它确保所有的任务都是按顺序完成,并且不会同时发生竞争条件。 ```java ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); ``` 以上提到的各种默认线程池都有其特点,在某些情况下可能已经足够满足应用的需求[^3]。 #### 自定义线程池的使用方式 然而,默认线程池并不总是最佳选择,特别是在面对复杂业务逻辑的情况下。这时可以通过继承 `ThreadPoolExecutor` 类来自定义更灵活的线程池实现: ```java import java.util.concurrent.*; public class CustomThreadPool { private final ThreadPoolExecutor executor; public CustomThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit) { this.executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, new LinkedBlockingQueue<>(), new CustomThreadFactory(), // 定制化线程工厂 new ThreadPoolExecutor.CallerRunsPolicy() // 配置拒绝策略 ); } public Future<?> submit(Runnable task){ return executor.submit(task); } } ``` 在这个例子中,除了设置基本参数外还可以指定阻塞队列类型、线程工厂以及饱和政策等高级选项来更好地适应具体应用场景的要求[^2]。 #### 主要区别 主要的区别在于灵活性上。默认线程池提供了简单易用的方式来进行多线程编程,但对于一些特殊场景下的性能优化和支持不够充分。而通过自定义线程池,则可以根据实际项目的负载特性调整各个配置项,从而达到更好的资源利用率和服务质量保障效果[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值