,,java 中Executor, ExecutorService 和 Executors 间的不同

,,java 中Executor, ExecutorService 和 Executors 间的不同

本文主要介绍了java中的执行者、执行者服务和执行者之间不同的相关资料。有需要的可以参考一下。

java 中Executor, ExecutorService 和 Executors 间的不同

Java。util。并发。执行者,Java。util。并发。执行服务,Java。util。并发。执行器都是Java Executor框架的一部分,用来提供线程池的功能。因为创建和管理线程是非常累的,而且操作系统通常对线程数量有限制,所以建议使用线程池来并发执行任务,而不是每次有请求进来就创建一个线程。使用线程池不仅可以提高应用程序的响应时间,还可以避免出现“java.lang.out of memory error:无法创建新的原生线程”等错误。

在Java 1.5中,开发者需要关注线程池的创建和管理,但是在Java 1.5之后,Executor框架提供了多种内置线程池,比如:FixedThreadPool(包含固定数量的线程)、CachedThreadPool(根据需要创建新线程)等等。

Executor

Executor、ExecutorService和Executors的主要区别在于,Executor是一个抽象的核心接口(大致代码如下)。

公共接口执行器{

void execute(Runnable命令);

}

与将任务和执行耦合在一起的java.lang.Thread类不同,执行器将任务本身与执行任务分开。你可以阅读thread和executor的区别,了解更多关于Thread和Executor的区别。

ExecutorService

ExecutorService接口扩展了Executor接口,提供了返回未来对象、终止和关闭线程池等方法。当调用shutDown方法时,线程池将停止接受新任务,但将完成挂起的任务。

Future object提供了异步执行,也就是说你不必等待任务执行完成,只需提交需要执行的任务,然后在需要的时候检查Future是否已经有了结果。如果任务已经执行,可以通过Future.get()方法得到执行结果。需要注意的是,Future.get()方法是一个阻塞方法。如果任务在被调用时没有完成,它会一直等到任务完成。

还可以通过ExecutorService.submit()方法返回的Future对象取消任务的执行。Future提供了cancel()方法来取消挂起任务的执行。

ExecutorService部分代码如下:

公共接口执行器服务扩展执行器{

void shutdown()。

T FutureT submit(可调用任务);

T FutureT submit(可运行任务,测试结果);

T ListFutureT invokeAll(集合?extends CallableT tasks,long timeout,TimeUnit unit)抛出InterruptedException

}

Executors

Executors是一个工具类,类似于集合。提供工厂方法来创建不同类型的线程池,如FixedThreadPool或CachedThreadPool。

Executors 部分代码:

公共类执行者{

public static ExecutorService newFixedThreadPool(int nThreads){

返回新的ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit。毫秒,new LinkedBlockingQueueRunnable());

}

public static ExecutorService newCachedThreadPool(){

返回新的ThreadPoolExecutor(0,整数。MAX_VALUE,60L,时间单位。SECONDS,new SynchronousQueueRunnable());

}

}

下面详细看一下三者的区别:

执行者对执行者服务对执行者

如上所述,这三者都是Executor框架的一部分。Java开发人员有必要学习和理解它们,以便更有效地使用Java提供的不同类型的线程池。总结一下三者的区别,这样可以更好的理解:

executor和ExecutorService这两个接口的主要区别在于,ExecutorService接口继承了Executor接口,是Executor的子接口。

Executor和ExecutorService的第二个区别是Executor接口定义了execute()方法来接收Runnable接口的一个对象,而ExecutorService接口中的submit()方法可以接受Runnable和Callable接口的对象。

Executor和ExecutorService接口的第三个区别是,Executor中的execute()方法不返回任何结果,而ExecutorService中的submit()方法可以通过一个Future对象返回操作结果。

Executor和ExecutorService接口的第四个区别是,除了允许客户端提交任务,ExecutorService还提供了控制线程池的方法。例如,调用shutDown()方法来终止线程池。你可以通过《Java Concurrency in Practice》这本书了解更多关于关闭线程池以及如何处理挂起任务的知识。

Executors类提供工厂方法来创建不同类型的线程池。例如,newSingleThreadExecutor()创建一个只有一个线程的线程池,newFixedThreadPool(int numoftThreads)创建一个固定线程数的线程池。newCachedThreadPool()可以根据需要创建新线程,但是如果现有线程空闲,它将重用它们。

总结

下表列出了Executor和ExecutorService之间的差异:

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: