【readme】
- 使用只有单个线程的线程池(最简单)
- Thread.join()
- 可重入锁 ReentrantLock + Condition 条件变量(多个) ; 原理如下:
- 任务1执行前在锁1上阻塞;执行完成后在锁2上唤醒;
- 任务2执行前在锁2上阻塞,执行完成后在锁3上唤醒;
- 任务n执行前在锁n上阻塞,执行完成后在锁n+1上唤醒;
- 以此类推 ..............
- 补充:
- 第1条任务执行前可以不阻塞,但执行完成后必须唤醒;(如果要阻塞,则可以让主线程来唤醒第1条任务);
- 补充: 最后一条任务执行后可以不唤醒,但执行前必须阻塞; (如果要唤醒,则最后一条任务执行完成后唤醒主线程);
- 与可重入锁类似,可以使用monitor监视器锁(多个);
- 与可重入锁类似,使用 Semaphore 信号量(多个);
- 与可重入锁类似,CountDownLatch : 倒计时锁存器(多个);
- 与可重入锁类似,CyclicBarrier 循环栅栏(多个) ;
【1】单个线程的线程池
参数设置:核心线程数=1, 最大线程数=1,就能保证线程池中只有1个线程在运行;
public class OrderlySingleThreadPoolTest {
public static void main(String[] args) {
ThreadPoolExecutor singleThreadPool =
new ThreadPoolExecutor(1, 1, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(100));
singleThreadPool.execute(new Task(1));
singleThreadPool.execute(new Task(2));
singleThreadPool.execute(new Task(3));
singleThreadPool.execute(new Task(4));
singleThreadPool.execute(new Task(5));
singleThreadPool.shutdown();
}
private static class Task implements Runnable {
int order; // 执行序号
Task(int order) {
this.order = order;
}
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
PrintUtils.print("序号=" + order + "执行完成");
}
}
}
【打印结果】

1206

被折叠的 条评论
为什么被折叠?



