java.util.concurrent.Executor, java.util.concurrent.ExecutorService, java.util.concurrent. Executors 这三者均是 Java Executor 框架的一部门,用来提供线程池的成果。因为建设和打点线程很是心累,而且操纵系统凡是对线程数有限制,所以发起利用线程池来并发执行任务,而不是每次请求进来时建设一个线程。利用线程池不只可以提高应用的响应时间,还可以制止”java.lang.OutOfMemoryError: unable to create new native thread” 之类的错误。
在 Java 1.5 时,开拓者需要体贴线程池的建设和打点,但在 Java 1.5 之后 Executor 框架提供了多种内置的线程池,譬喻:FixedThreadPool(包括牢靠命目标线程),CachedThreadPool(可按照需要建设新的线程)等等。
Executor
Executor, ExecutorService, 和 Executors 最主要的区别是 Executor 是一个抽象层面的焦点接口(大抵代码如下)。
public interface Executor { void execute(Runnable command); }
差异于 java.lang.Thread 类将任务和执行耦合在一起, Executor 将任务自己和执行任务疏散,可以阅读 difference between Thread and Executor 来相识 Thread 和 Executor 间更多的差异。
ExecutorService
ExecutorService 接口 对 Executor 接口举办了扩展,提供了返回 Future 工具,终止,封锁线程池等要领。当挪用 shutDown 要领时,软件开发,线程池会遏制接管新的任务,但会完成正在 pending 中的任务。
Future 工具提供了异步执行,软件开发,这意味着无需期待任务执行的完成,只要提交需要执行的任务,然后在需要时查抄 Future 是否已经有了功效,假如任务已经执行完成,就可以通过 Future.get() 要领得到执行功效。需要留意的是,Future.get() 要领是一个阻塞式的要领,假如挪用时任务还没有完成,软件开发,会期待直到任务执行竣事。
通过 ExecutorService.submit() 要领返回的 Future 工具,还可以打消任务的执行。Future 提供了 cancel() 要领用来打消执行 pending 中的任务。
ExecutorService 部门代码如下:
public interface ExecutorService extends Executor { void shutdown(); <T> Future<T> submit(Callable<T> task); <T> Future<T> submit(Runnable task, T result); <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException; }
Executors
Executors 是一个东西类,雷同于 Collections。提供工场要领来建设差异范例的线程池,好比 FixedThreadPool 或 CachedThreadPool。
Executors 部门代码:
public class Executors { public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()); } public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } }
下面具体看一下三者的区别:
Executor vs ExecutorService vs Executors
正如上面所说,这三者均是 Executor 框架中的一部门。Java 开拓者很有须要进修和领略他们,以便更高效的利用 Java 提供的差异范例的线程池。总结一下这三者间的区别,以便各人更好的领略:
总结
下表列出了 Executor 和 ExecutorService 的区别:
译者注
小我私家以为,操作 Executors 类提供的工场要领来建设一个线程池是很利便,但对付需要按照实际环境自界说线程池某些参数的场景,就不太合用了。