版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/successA/article/details/52888977
为什么要使用线程池?
主要是因为线程在创建和销毁的时候开销比较大,创建线程池,可以让线程并发执行。如果线程的创建和销毁时间,跟线程之间切换时间差不多,也没有用线程池的必要。
线程池是什么?
线程池是一种多线程处理机制,处理过程将任务添加到队列里面,然后创建线程后自动启动这些任务。
线程池由组成呢?
线程池管理器(ThreadPoolManager):创建并管理线程池。
工作线程(WorkThread):线程池中线程。
任务接口(Task):每个任务必须实现的接口,已提供工作线程任务调度的执行。
任务队列:用于存放没有处理的任务,提供一种缓冲机制。
线程池分类?
jdk线程池主要分成四种,
newCachedThreadPool:可缓存线程池,自行创建和回收线程。
newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
项目经验
在公司里面,经常用ScheduledThreadPool来做跑批的功能,比如对账、自动投标等功能,当然也可以使用Quartz框架。
下面写一个ScheduledThreadPool的demo,简单介绍一下ScheduledThreadPool的使用。
package com.xm.hashmap;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ScheduledExecutorService schedule=Executors.newScheduledThreadPool(2);
/**
* 延迟1s执行一次任务
*/
schedule.schedule(new Runnable() {
@Override
public void run() {
System.out.println("hello world runnable");
}
}, 1000, TimeUnit.MILLISECONDS);
/**
* 延迟2s执行一次任务
*/
Future result =schedule.schedule(new Callable<String>() {
@Override
public String call() throws Exception {
return "hello world callable";
}
}, 100, TimeUnit.MILLISECONDS);
System.out.println(result.get());
/**
* 延迟,2s钟执行一次
*/
schedule.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("周期任务执行");
}
}, 1000, 2000, TimeUnit.MILLISECONDS);
/**
* 延迟
*/
schedule.scheduleWithFixedDelay(new Runnable(){
@Override
public void run() {
System.out.println("定时任务执行 ");
}
}, 1000, 3000, TimeUnit.MILLISECONDS);
//关闭定时和周期任务的执行
Thread.sleep(1000*10);
schedule.shutdown();//平缓的关闭
System.out.println("pool shutdown:"+schedule.isShutdown());
while (!schedule.isTerminated()) {
schedule.awaitTermination(1, TimeUnit.SECONDS);
}
}
}
结果图: