秦皇岛做网站公司有哪些公众号引流推广平台
线程池
- 线程池
- 创建线程池
- 关闭线程池
- 使用
- 获取多个结果
线程池
一个线程池中存在许多准备运行的空闲线程,把Runnable对象交给线程池,会有一个线程调用其run()方法,当调用完后线程不会死亡,而是在池中继续为下一次请求服务
利用线程池可避免创建大量生命周期很短的线程,同时也可限制并发线程的数目
创建线程池
创建方法 | 备注 |
---|---|
Executors.newCachedThreadPool() | 若线程池无可用空闲线程,则创建一个,空闲线程保留60秒 |
Executors.newFixedThreadPool(int) | 构建固定大小的线程池,空闲线程会一直保留 若任务数>线程数,其余的任务置于队列中 |
Executors.newSingleThreadExecutor() | 大小为1的线程池,按顺序执行任务 |
Executors.newScheduledThreadPool(int) | 创建预定执行的线程池 |
上面方法都返回实现了ExecutorService接口的ThreadPoolExecutor类,可用下面的方法将Runnable或Callable传给ExecutorService
创建方法 | 备注 |
---|---|
Future<?> submit(Runnable task) | get()方法完成后返回null |
Future<T> submit(Runnable task, T result) | get()方法完成后返回result |
Future<?> submit(Callable task) | 计算好后才返回Future对象 |
关闭线程池
- shundown,关闭后不再接受新的任务,当内部的任务都完成后,池中的线程死亡
- shundownNow,取消尚未开始的所有任务并试图中断正在运行的线程
使用
若要获取到结果,可通过submit()方法返回future
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(new Runnable() {@Overridepublic void run() {}
});
executorService.shutdown();
获取多个结果
- ExecutorService.invokeAny()提交一个Callable的集合,并返回某个已完成任务的Future,但不能确定是哪个任务
- ExecutorService.invokeAll()提交一个Callable的集合,并返回所有任务的Future集合,但当一个任务耗时过长时,其他任务也得等待
- new ExecutorCompletionService<>(Executors.newCachedThreadPool())构建ExecutorCompletionService管理future对象的阻塞队列,其包含了完成任务的执行结果