1、定长线程池
ScheduledExecutorService es = Executors.newScheduledThreadPool(1);
1代表线程池的大小。
2、用法
// 线程一
es.scheduleAtFixedRate(() -> {
try{
System.out.println("#################" + new Date());
Thread.sleep(7000);
} catch(InterruptedException e) {
e.printStackTrace();
}
},0, 5, TimeUnit.SECONDS);
// 线程二
es.scheduleWithFixedDelay(() -> {
try{
System.out.println("###########testTwo" + new Date());
Thread.sleep(7000);
} catch(InterruptedException e) {
e.printStackTrace();
}
},0, 5, TimeUnit.SECONDS);
第一个参数 runnable接口
第二个参数 执行之前的延迟时间
第三个参数 循环间隔
第四个参数 时间类型
scheduleWithFixedDelay
从执行完成之后开始计算,5秒后再次执行
scheduleAtFixedRate
从执行开始之后开始计算,如果执行时间小于,那再等时间够五秒执行下一次。如果执行时间大于5秒,则结束后直接执行。
3、线程池大小为1,如果开启两个线程,则线程2会等待
执行顺序 先执行线程1,4秒后执行线程2 ,然后1秒后执行线程1的第二次,立刻执行线程2的第二次
总结:线程先执行所有的请求,最后再执行请求的循环。
4、举例用法
@RestController
public class TestController {
@Autowired
private TestService testService;
@PostConstruct
private void init(){
for (int i = 0; i < 20; i++) {
System.out.println("start #############################@@@@@@@@@@@@@@@@@@@");
testService.testStart(i + 1);
System.out.println("end #############################@@@@@@@@@@@@@@@@@@@");
}
}
}
@Service
public class TestService {
private ScheduledExecutorService es = Executors.newScheduledThreadPool(2);
public void testStart(Integer i){
es.scheduleWithFixedDelay(() -> {
try{
System.out.println(i + "#################" + new Date());
Thread.sleep(7000);
} catch(InterruptedException e) {
e.printStackTrace();
}
},0, 3, TimeUnit.MINUTES);
}
}
5、实际用法
// 阻塞队列
private BlockingQueue<String> queue = new LinkedBlockingQueue<>(1000);
// 创建任务
private ScheduledExecutorService es = Executors.newScheduledThreadPool(1);
/**
* 构造函数,执行execute方法
*/
public BlockingQueueTask() {
execute();
}
/**
* 添加信息至队列中
*
* @param str
*/
public void addQueue(String str) {
queue.add(str);
}
/**
* 初始化执行
*/
public void execute() {
//每一分钟执行一次
es.scheduleWithFixedDelay(() -> {
try {
log.info("队列执行循环~");
// 从队列中获取
String strTest = queue.take();
log.info("从队列中获取queue:{}", strTest );
checkReceipt(strTest );
log.info("完成队列消费~");
} catch (InterruptedException e) {
e.printStackTrace();
}
}, 0, 1, TimeUnit.MINUTES);
}