更新时间:2020-03-27 12:09:59 来源:极悦 浏览1940次
ExecutorService是java中的一个异步执行的框架,通过使用ExecutorService可以方便的创建多线程执行环境。
本文将会详细的讲解ExecutorService的具体使用。
创建ExecutorService
通常来说有两种方法来创建ExecutorService。
第一种方式是使用Executors中的工厂类方法,例如:
ExecutorServiceexecutor=Executors.newFixedThreadPool(10);
除了newFixedThreadPool方法之外,Executors还包含了很多创建ExecutorService的方法。
第二种方法是直接创建一个ExecutorService,因为ExecutorService是一个interface,我们需要实例化ExecutorService的一个实现。
这里我们使用ThreadPoolExecutor来举例:
ExecutorServiceexecutorService=
newThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,
newLinkedBlockingQueue<Runnable>());
为ExecutorService分配Tasks
ExecutorService可以执行Runnable和Callable的task。其中Runnable是没有返回值的,而Callable是有返回值的。我们分别看一下两种情况的使用:
RunnablerunnableTask=()->{
try{
TimeUnit.MILLISECONDS.sleep(300);
}catch(InterruptedExceptione){
e.printStackTrace();
}
};
Callable<String>callableTask=()->{
TimeUnit.MILLISECONDS.sleep(300);
return"Task'sexecution";
};
将task分配给ExecutorService,可以通过调用xecute(),submit(),invokeAny(),invokeAll()这几个方法来实现。
execute()返回值是void,他用来提交一个Runnabletask。
executorService.execute(runnableTask);
submit()返回值是Future,它可以提交Runnabletask,也可以提交Callabletask。提交Runnable的有两个方法:
<T>Future<T>submit(Runnabletask,Tresult);
Future<?>submit(Runnabletask);
第一个方法在返回传入的result。第二个方法返回null。
再看一下callable的使用:
Future<String>future=
executorService.submit(callableTask);
invokeAny()将一个task列表传递给executorService,并返回其中的一个成功返回的结果。
Stringresult=executorService.invokeAny(callableTasks);
invokeAll()将一个task列表传递给executorService,并返回所有成功执行的结果:
List<Future<String>>futures=executorService.invokeAll(callableTasks);
关闭ExecutorService
如果ExecutorService中的任务运行完毕之后,ExecutorService不会自动关闭。它会等待接收新的任务。如果需要关闭ExecutorService,我们需要调用shutdown()或者shutdownNow()方法。
shutdown()会立即销毁ExecutorService,它会让ExecutorServic停止接收新的任务,并等待现有任务全部执行完毕再销毁。
executorService.shutdown();
shutdownNow()并不保证所有的任务都被执行完毕,它会返回一个未执行任务的列表:
List<Runnable>notExecutedTasks=executorService.shutdownNow();
oracle推荐的最佳关闭方法是和awaitTermination一起使用:
executorService.shutdown();
try{
if(!executorService.awaitTermination(800,TimeUnit.MILLISECONDS)){
executorService.shutdownNow();
}
}catch(InterruptedExceptione){
executorService.shutdownNow();
}
先停止接收任务,然后再等待一定的时间让所有的任务都执行完毕,如果超过了给定的时间,则立刻结束任务。
Future
submit()和invokeAll()都会返回Future对象。之前的文章我们已经详细讲过了Future。这里就只列举一下怎么使用:
Future<String>future=executorService.submit(callableTask);
Stringresult=null;
try{
result=future.get();
}catch(InterruptedException|ExecutionExceptione){
e.printStackTrace();
}
ScheduledExecutorService
ScheduledExecutorService为我们提供了定时执行任务的机制。
我们这样创建ScheduledExecutorService:
ScheduledExecutorServiceexecutorService
=Executors.newSingleThreadScheduledExecutor();
executorService的schedule方法,可以传入Runnable也可以传入Callable:
Future<String>future=executorService.schedule(()->{
//...
return"Helloworld";
},1,TimeUnit.SECONDS);
ScheduledFuture<?>scheduledFuture=executorService.schedule(()->{
//...
},1,TimeUnit.SECONDS);
还有两个比较相近的方法:
scheduleAtFixedRate(Runnablecommand,longinitialDelay,longperiod,TimeUnitunit)
scheduleWithFixedDelay(Runnablecommand,longinitialDelay,longdelay,TimeUnitunit)
两者的区别是前者的period是以任务开始时间来计算的,后者是以任务结束时间来计算。
ExecutorService和Fork/Join
java7引入了Fork/Join框架。那么两者的区别是什么呢?
ExecutorService可以由用户来自己控制生成的线程,提供了对线程更加细粒度的控制。而Fork/Join则是为了让任务更加快速的执行完毕。
以上就是极悦java培训机构的小编针对“Java高级架构师视频教程,ExecutorService的使用”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习