Java的四种常见线程池及定时线程池的实现
四种常见线程池
1. FixedThreadPool(固定大小线程池)
该线程池包含固定数量的线程,当有新任务提交时,如果线程池中有空闲线程,则立即执行;如果没有空闲线程,则任务将等待,直到有空闲线程为止。
2. CachedThreadPool(缓存线程池)
该线程池可以根据需要创建新线程,如果有空闲线程可用,则会重用空闲线程;如果没有可用线程,则会创建新线程。适用于任务执行时间短暂的情况。
3. SingleThreadExecutor(单线程线程池)
该线程池只有一个工作线程,所有任务按照提交顺序依次执行。
4. ScheduledThreadPool(定时线程池)
该线程池用于执行延迟任务或定期任务,可以指定任务的延迟时间或执行周期。
ScheduledThreadPool的实现
在Java中,我们可以通过Executors类来创建ScheduledThreadPool。Executors类提供了几个静态方法来创建不同类型的线程池,包括ScheduledThreadPool。
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledThreadPoolExample {
public static void main(String[] args) {
// 创建ScheduledThreadPool,参数为线程池的大小
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
// 延迟1秒后执行任务
scheduledThreadPool.schedule(new RunnableTask(), 1, TimeUnit.SECONDS);
// 延迟2秒后执行任务,并且每隔3秒执行一次
scheduledThreadPool.scheduleAtFixedRate(new RunnableTask(), 2, 3, TimeUnit.SECONDS);
// 延迟2秒后执行任务,任务执行完成后,再延迟3秒执行下一次任务
scheduledThreadPool.scheduleWithFixedDelay(new RunnableTask(), 2, 3, TimeUnit.SECONDS);
// 关闭线程池
scheduledThreadPool.shutdown();
}
static class RunnableTask implements Runnable {
@Override
public void run() {
System.out.println("Task is running. Thread: " + Thread.currentThread().getName());
}
}
}
在上面的例子中,我们创建了一个大小为3的ScheduledThreadPool
,并使用schedule()
、scheduleAtFixedRate()
和scheduleWithFixedDelay()
方法来安排任务的执行。
schedule()
方法用于延迟执行一次任务,scheduleAtFixedRate()
和scheduleWithFixedDelay()
方法用于周期性地执行任务。
shutdown()
方法用于关闭线程池,不再接受新的任务提交,但会等待已经提交的任务执行完成。如果你希望立即停止所有任务并关闭线程池,可以使用shutdownNow()
方法。