持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
使用newSingleThreadExecutor()方法创建单一线程池
使用newSingleThreadExecutor()方法可以创建单一线程池,单一线程池可以实现以队列的方式执行具体任务。
实现代码如下:
public class TheRunnable implements Runnable {
private String username;
public TheRunnable(String username){
super();
this.username=username;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() +" username= "+username+" 开始时间:"+System.currentTimeMillis());
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() +" username= "+username+" 结束时间:"+System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
复制代码
运行类代码如下:
public class SingleThreadExecutorRun {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i < 3 ; i++) {
executorService.execute(new TheRunnable(String.valueOf(i+1)));
}
}
}
复制代码
运行结果如下:
pool-1-thread-1 username= 1 开始时间:1653900159583
pool-1-thread-1 username= 1 结束时间:1653900161592
pool-1-thread-1 username= 2 开始时间:1653900161594
pool-1-thread-1 username= 2 结束时间:1653900163608
pool-1-thread-1 username= 3 开始时间:1653900163608
pool-1-thread-1 username= 3 结束时间:1653900165613
复制代码
从运行结果看出单一线程池最多只有1个线程在运行。
ThreadPoolExecutor使用
ThreadPoolExecutor非常方便地创建线程池对象,而不需要大量new实例化Thread相关的代码。
使用Executors工厂类的newXXXThreadExecutor()方法可以快速创建线程池,但创建的细节需要查看源码。
使用newSingleThreadExecutor()方法时内部是实例化了一个ThreadPoolExecutor类的实例,源码如下:
public static ExecutorService newSingleThreadExecutor(){
return new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}
复制代码
ThreadPoolExecutor最常使用的构造方法是
ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue)
复制代码
参数说明:
-
corePoolSize:池中所保存的线程数,包括空闲线程,就是核心线程数。
-
maximumPoolSize:池中允许的最大线程数。
-
KeepAliveTime:当线程数量大于corePoolSize值时,在没有超过指定的时间内是不从线程池中将空闲线程删除的,如果超过此时间单位,则删除。
-
unit:keepAliveTime参数的时间单位。
-
workQueue:执行前用于保持任务的队列,此队列保持由execute方法提交的Runnable任务。