定时调用线程


import java.sql.Timestamp;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Test {
public static void main(String[] args) throws InterruptedException {
//新建一个大小为1的计划线程池
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
ScheduledExecutorService scheduledExecutorService2 = Executors.newScheduledThreadPool(1);
//添加一个打印当前线程信息计划任务,该任务在5秒后执行 只执行一次
// scheduledExecutorService.schedule(new testThread(),5,TimeUnit.SECONDS);
//添加一个打印当前线程信息计划任务,该任务在2秒后首次执行,之后每5秒执行一次。如果任务执行时间超过了5秒,则下一次将会在前一次执行完成之后立即执行
//每5s执行一次:2s后+进入线程执行(如果休眠4s,定时5s)+5s+结束线程+进入线程继续循环
scheduledExecutorService.scheduleAtFixedRate(new testThread(),2,5, TimeUnit.SECONDS);
//添加一个打印当前线程信息计划任务,该任务在2秒后首次执行,之后每次在任务执行之后5秒执行下一次。
//每5s执行一次:线程结束后+定时5s+进入线程(休眠4s)+线程结束+继续循环调用
scheduledExecutorService2.scheduleWithFixedDelay(new testThread(),2,5,TimeUnit.SECONDS);
//逐个清除 idle(空闲状态的线程) 状态的线程
//scheduledExecutorService.shutdown();
//阻塞,在线程池被关调之前代码不再往下走
//scheduledExecutorService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
}
static class testThread implements Runnable {
@Override
public void run() {
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Date date = new Timestamp(System.currentTimeMillis());
System.out.println(Thread.currentThread()+":"+date);
}
}
}
打印结果:

Thread[pool-1-thread-1,5,main]:2022-02-22 15:10:40
Thread[pool-2-thread-1,5,main]:2022-02-22 15:10:40
Thread[pool-1-thread-1,5,main]:2022-02-22 15:10:45
Thread[pool-2-thread-1,5,main]:2022-02-22 15:10:49
Thread[pool-1-thread-1,5,main]:2022-02-22 15:10:50
Thread[pool-1-thread-1,5,main]:2022-02-22 15:10:55
Thread[pool-2-thread-1,5,main]:2022-02-22 15:10:58
Thread[pool-1-thread-1,5,main]:2022-02-22 15:11:00

posted @ 2022-02-22 16:17  a快乐码农  阅读(134)  评论(0编辑  收藏  举报