import java.util.concurrent.*;
public class Main {
public static void main(String[] args) {
//ExecutorService只是一个接口,Java标准库提供了几个常用的实现类
///1、创建一个固定大小的线程池
ExecutorService es = Executors.newFixedThreadPool(4);
for (int i = 0; i < 6; i++) {
es.submit(new Task("" + i));
}
///关闭线程池
es.shutdown();
///2、创建指定动态范围的线程池
///CachedThreadPool
int min = 4;
int max = 10;
ExecutorService executorService = new ThreadPoolExecutor(min, max, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
for (int i = 0; i < 6; i++) {
executorService.submit(new Task("cachedThreadPool" + i));
}
executorService.shutdown();
///3、仅单线程执行的线程池SingleThreadExecutor
///ScheduledThreadPool可以定期调度多个任务
ScheduledExecutorService ses = Executors.newScheduledThreadPool(4);
//1s后执行一次任务
ses.schedule(new Task("one-time"), 1, TimeUnit.SECONDS);
//2s后开始执行,每3s执行
ses.scheduleAtFixedRate(new Task("fix-rate"), 2, 3, TimeUnit.SECONDS);
//2s后开始,以固定的3s为间隔执行
ses.scheduleWithFixedDelay(new Task("fixed-delay"), 2, 3, TimeUnit.SECONDS);
}
}
class Task implements Runnable {
private final String name;
public Task(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println("start task" + name);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.println("end task" + name);
}
}
fixedRate和fixedDelay的区别
fixedDelay:在一个任务执行完后隔n秒
│░░░│ │░░░░░│ │░░│ │░
└───┼───────┼─────┼───────┼──┼───────┼──>
│<─────>│ │<─────>│ │<─────>│
fixedRate:不管任务执行的时间多长
│░░░░ │░░░░░░ │░░░ │░░░░░ │░░░
├───────┼───────┼───────┼───────┼────>
│<─────>│<─────>│<─────>│<─────>│