更多 Java 并发编程方面的文章,请参见文集《Java 并发编程》
ExecutorService
- Java 5 开始提供
- ExecutorService 为一个接口
- 实际上使用的是实现类 Executors
使用 ExecutorService 对比 使用 Thread 的优势
- ExecutorService 使用了线程池 Thread Pool,用户不需要去关心线程的创建
- 由于使用了线程池,ExecutorService 更加节省资源
- ExecutorService 使用异步方式管理线程
- ExecutorService 的 submit() 方法可以传入一个 Callable 实例,得到返回结果 Future<T>
- invokeAll() 方法和 invokeAny() 方法 可以批量控制线程的启动
-
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
同时启动所有线程,返回所有线程的结果 Future<T> -
public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
同时启动所有线程,返回其中一个线程的结果
-
- shutdown() 方法和 shutdownNow() 方法 可以批量控制线程的关闭
-
shutdown()
:allow previously submitted tasks to execute before terminating 等待之前提交的任务执行完 -
shutdownNow()
:prevents waiting tasks from starting and attempts to stop currently executing tasks 不会等待之前提交的任务执行完
-
submit() 方法 VS execute() 方法
- execute() 方法只能传入 Runnable 实例
- submit() 方法即可以传入 Runnable 实例,也可以传入 Callable 实例,得到返回结果 Future<T>
具体的使用,请参考 Java 实现多线程的三种方式