java多线程——线程池

线程池

  • 线程池
  • 创建线程池
  • 关闭线程池
  • 使用
  • 获取多个结果

线程池

一个线程池中存在许多准备运行的空闲线程,把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 submit(Runnable task, T result) get()方法完成后返回result
Future submit(Callable task) 计算好后才返回Future对象

关闭线程池

  • shundown,关闭后不再接受新的任务,当内部的任务都完成后,池中的线程死亡
  • shundownNow,取消尚未开始的所有任务并试图中断正在运行的线程

使用

若要获取到结果,可通过submit()方法返回future

ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(new Runnable() {
    @Override
    public void run() {
    
    }
});
executorService.shutdown();

获取多个结果

  • ExecutorService.invokeAny()提交一个Callable的集合,并返回某个已完成任务的Future,但不能确定是哪个任务
  • ExecutorService.invokeAll()提交一个Callable的集合,并返回所有任务的Future集合,但当一个任务耗时过长时,其他任务也得等待
  • new ExecutorCompletionService<>(Executors.newCachedThreadPool())构建ExecutorCompletionService管理future对象的阻塞队列,其包含了完成任务的执行结果

你可能感兴趣的:(#,java多线程,java,开发语言)