Java中的四种线程池 . ExecutorService
1.缓存线程池
缓存线程池的长度无限制,在执行线程时,先判断线程池中是否存在空闲线程,如果存在就直接使用,不存在则创建线程再使用。
ExecutorService service = Executors.newCachedThreadPool();
service.execute(new Runnable() {
@Override
public void run() {
System.out.println("线程的名称:"+Thread.currentThread().getName());
}
});
2.定长线程池
定长线程池在创建时需要定义线程池的长度,在执行线程时,先判断线程池中是否存在空闲线程,如果存在就直接使用,不存在则需要判断线程池是否已满,如果已满则等待线程池存在空闲线程,未满则创建线程放入线程池再使用。
ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(new Runnable() {
@Override
public void run() {
System.out.println("线程的名称:"+Thread.currentThread().getName());
}
});
3.单线程线程池
单线程线程池与定长线程池相似,只是长度为一。在执行线程时,先判断线程池中的线程是否是空闲线程,如果空闲就直接使用,不是空闲则等待线程空闲。
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(new Runnable() {
@Override
public void run() {
System.out.println("线程的名称:"+Thread.currentThread().getName());
}
});
4.周期性任务定长线程池
周期性任务定长线程池在执行线程时,先判断线程池中是否存在空闲线程,如果存在就直接使用,不存在则需要判断线程池是否已满,如果已满则等待线程池存在空闲线程,未满则创建线程放入线程池再使用。
定时执行, 当某个时机触发时, 自动执行某任务
ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
/**
* 定时执行
* 参数1. runnable类型的任务
* 参数2. 时长数字
* 参数3. 时长数字的单位
*/
service.schedule(new Runnable() {
@Override
public void run() {
System.out.println("线程的名称:"+Thread.currentThread().getName());
}
},5,TimeUnit.SECONDS);
/**
* 周期执行
* 参数1. runnable类型的任务
* 参数2. 时长数字(延迟执行的时长)
* 参数3. 周期时长(每次执行的间隔时间)
* 参数4. 时长数字的单位
*/
service.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("线程的名称:"+Thread.currentThread().getName());
}
},5,2,TimeUnit.SECONDS);