【JDK中提供了哪些线程池】

简介: 【JDK中提供了哪些线程池】

理论

在JDK中,提供了四种线程池来管理线程,分别为:

  1. FixedThreadPool(固定大小线程池):该线程池的大小固定,不会随着任务数的增加而增加。当池子中的线程都在处理任务时,新的任务会处于等待状态,直到有线程可用。
  2. CachedThreadPool(缓存线程池):该线程池的大小不固定,可以根据需求自动调整线程池的大小。当池子中的线程都在处理任务时,新的任务会创建新的线程执行。
  3. SingleThreadExecutor(单一线程池):该线程池只有一个线程,确保所有任务都在同一线程中按顺序执行。所有提交给该线程的任务将按照先进先出(FIFO)的顺序执行。
  4. ScheduledThreadPool(定时器线程池):该线程池允许延迟或定时执行任务。它可以根据需要执行任务,并在任务执行完成后重新执行任务。

使用线程池的好处包括避免线程的频繁创建和销毁、线程的重用、线程的超时控制、任务队列的缓冲和限制等。根据任务的不同需求,可以选择不同类型的线程池来管理线程。

代码

以下是示例代码:

  1. FixedThreadPool:
ExecutorService executor = Executors.newFixedThreadPool(5); // 创建一个固定大小的线程池,大小为5
for (int i = 0; i < 10; i++) {
    executor.execute(new Runnable() { // 往线程池中提交10个任务
        @Override
        public void run() {
            System.out.println("Thread name: " + Thread.currentThread().getName()); // 输出当前线程的名称
            // do something
        }
    });
}
executor.shutdown(); // 关闭线程池
  1. CachedThreadPool:
ExecutorService executor = Executors.newCachedThreadPool(); // 创建一个缓存线程池
for (int i = 0; i < 10; i++) {
    executor.execute(new Runnable() { // 往线程池中提交10个任务
        @Override
        public void run() {
            System.out.println("Thread name: " + Thread.currentThread().getName()); // 输出当前线程的名称
            // do something
        }
    });
}
executor.shutdown(); // 关闭线程池
  1. SingleThreadExecutor:
ExecutorService executor = Executors.newSingleThreadExecutor(); // 创建一个单一线程池
for (int i = 0; i < 10; i++) {
    executor.execute(new Runnable() { // 往线程池中提交10个任务
        @Override
        public void run() {
            System.out.println("Thread name: " + Thread.currentThread().getName()); // 输出当前线程的名称
            // do something
        }
    });
}
executor.shutdown(); // 关闭线程池
  1. ScheduledThreadPool:
ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(5); // 创建一个大小为5的定时器线程池
scheduledExecutor.schedule(new Runnable() { // 延迟1秒执行任务
    @Override
    public void run() {
        System.out.println("Task executed after 1 second.");
    }
}, 1, TimeUnit.SECONDS);
scheduledExecutor.scheduleAtFixedRate(new Runnable() { // 延迟1秒后开始执行任务,每隔2秒执行一次
    @Override
    public void run() {
        System.out.println("Task executed every 2 seconds.");
    }
}, 1, 2, TimeUnit.SECONDS);
scheduledExecutor.shutdown(); // 关闭线程池


相关文章
如何处理JDK线程池内线程执行异常?讲得这么通俗,别还搞不懂
本篇 《如何处理 JDK 线程池内线程执行异常》 这篇文章适合哪些小伙伴阅读呢? 适合工作中使用线程池却不知异常的处理流程,以及不知如何正确处理抛出的异常
|
SpringCloudAlibaba Java Go
JDK 线程池使用不当引发的饥饿死锁问题
JDK 线程池使用不当引发的饥饿死锁问题
122 0
JDK 线程池使用不当引发的饥饿死锁问题
|
存储 监控 Java
JDK 线程池如何保证核心线程不被销毁
JDK 线程池如何保证核心线程不被销毁
398 0
JDK 线程池如何保证核心线程不被销毁
|
Dubbo 搜索推荐 Java
如何解决JDK线程池中不超过最大线程数下快速消费任务
如何解决JDK线程池中不超过最大线程数下快速消费任务
101 0
如何解决JDK线程池中不超过最大线程数下快速消费任务
|
存储 缓存 监控
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(下)
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(下)
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(下)
|
缓存 Java 应用服务中间件
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(中)
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(中)
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(中)
|
存储 缓存 算法
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(上)
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(上)
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(上)
|
Java 应用服务中间件 容器
Tomcat是如何修正JDK原生线程池bug的?
为提高处理能力和并发度,Web容器一般会把处理请求的任务放到线程池,而JDK的原生线程池先天适合CPU密集型任务,于是Tomcat改造之。
117 0
Tomcat是如何修正JDK原生线程池bug的?
JDK线程池的ThreadFactory
JDK线程池:Executors.newFixedThreadPool , Executors.newSingleThreadExecutor,由一个ThreadFactory来创建新的线程,默认情况下为Executors.
7013 0
|
Java 数据库连接 数据库
从JDK源码角度看线程池原理
        “池”技术对我们来说是非常熟悉的一个概念,它的引入是为了在某些场景下提高系统某些关键节点性能,最典型的例子就是数据库连接池,JDBC是一种服务供应接口(SPI),具体的数据库连接实现类由不同厂商实现,数据库连接的建立和销毁都是很耗时耗资源的操作,为了查询数据库中某条记录,最原始的一个过程是建立连接、发送查询语句、返回查询结果、销毁连接,假如仅仅是一个很简单的查询语句,那么可能建立连接与销毁连接两个步骤就已经占所有资源时间消耗的绝大部分,如此低下的效率显然让人无法接受。
786 0