Appearance
多线程
Executors
//创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
private static ExecutorService executorService = Executors.newSingleThreadExecutor();
//创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
private static ExecutorService executor = Executors.newFixedThreadPool(10);
//创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
private static ExecutorService executorService = Executors.newCachedThreadPool();
//创建一个定长线程池,支持定时及周期性任务执行。
private static ExecutorService executorService = Executors.newScheduledThreadPool(10);CountDownLatch
- 用法1:某一线程在开始运行前等待n个线程执行完毕。将CountDownLatch的计数器初始化为new CountDownLatch(n),每当一个任务线程执行完毕,就将计数器减1 countdownLatch.countDown(),当计数器的值变为0时,在CountDownLatch上await()的线程就会被唤醒。一个典型应用场景就是启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。
- 用法2:实现多个线程开始执行任务的最大并行性。注意是并行性,不是并发,强调的是多个线程在某一时刻同时开始执行。类似于赛跑,将多个线程放到起点,等待发令枪响,然后同时开跑。做法是初始化一个共享的CountDownLatch(1),将其计算器初始化为1,多个线程在开始执行任务前首先countdownlatch.await(),当主线程调用countDown()时,计数器变为0,多个线程同时被唤醒。
CountDownLatch count = new CountDownLatch(6);
count.countDown();
count.await();