一个优秀的软件不会随意的创建、销毁线程,因为创建和销毁线程需要耗费大量的CPU时间以及需要和内存做出大量的交互。因此JDK5提出了使用线程池,让程序员把更多的精力放在业务逻辑上面,弱化对线程的开闭管理。
JDK提供了四种不同的线程池给程序员使用
首先使用线程池,需要用到ExecutorService接口,该接口有个抽象类AbstractExecutorService对其进行了实现,ThreadPoolExecutor进一步对抽象类进行了实现。最后JDK封装了一个Executor类对ThreadPoolExecutor进行实例化,因此通过Executor能够创建出具有如下四种特性的线程池
1. 无下界线程池
ExecutorService threadPool= Executors.newCachedThreadPool( ); 当线程数不足时,线程池会动态增加线程进行后续的任务调度
2. 固定线程数的线程池
ExecutorService threadPool= Executors.newFixedThreadPool(3); 创建具有固定线程数:3个的线程池
3. 单线程线程池
ExecutorService threadPool= Executors.newSingleThreadScheduledExecutor( );创建单例线程池,确保线程池内恒定有1条线程在工作
4. 调度线程池
ScheduledExecutorService threadPool= Executors.newSingleThreadScheduledExecutor( ); 创建一个定长线程池,定时或周期性地执行任务
1 package com.scl.thread.threadPool; 2 3 import java.util.concurrent.Executors; 4 import java.util.concurrent.ScheduledExecutorService; 5 import java.util.concurrent.TimeUnit; 6 7 public class ScheduledThreadPool 8 { 9 public static void main(String[] args) 10 { 11 // 创建定时调度线程池 12 ScheduledExecutorService threadPool = Executors.newSingleThreadScheduledExecutor(); 13 // 定时执行Runnable 14 threadPool.scheduleAtFixedRate(new Runnable() 15 { 16 17 @Override 18 public void run() 19 { 20 System.out.println("do some big Scheduled"); 21 } 22 }, 10, 3, TimeUnit.SECONDS); 23 } 24 }