专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java高级架构师视频教程,ExecutorService的使用

Java高级架构师视频教程,ExecutorService的使用

更新时间:2020-03-27 12:09:59 来源:动力节点 浏览1797次

ExecutorService是java中的一个异步执行的框架,通过使用ExecutorService可以方便的创建多线程执行环境。

  本文将会详细的讲解ExecutorService的具体使用。

Java高级架构师视频教程,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高级架构师视频教程,ExecutorService的使用

  以上就是动力节点java培训机构的小编针对“Java高级架构师视频教程,ExecutorService的使用”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>