ASP教程 PHP教程 JSP教程 CGI教程 XML教程 ASP.NET教程
  • JAVA教程
  • 当前位置:教程 > 程序设计 > JAVA教程 > 正文

    线程执行者(十一)执行者分离任务的启动和结果的处理

    编辑:教程网 来源:网络 时间:2013年08月16日 14:27

    执行者分离任务的启动和结果的处理

    通常,当你使用执行者执行并发任务时,你将会提交 Runnable或Callable任务给这个执行者,并获取Future对象控制这个方法。你可以发现这种情况,你需要提交任务给执行者在一个对象中,而处理结果在另一个对象中。基于这种情况,Java并发API提供CompletionService类。

    CompletionService 类有一个方法来提交任务给执行者和另一个方法来获取已完成执行的下个任务的Future对象。在内部实现中,它使用Executor对象执行任务。这种行为的优点是共享一个CompletionService对象,并提交任务给执行者,这样其他(对象)可以处理结果。其局限性是,第二个对象只能获取那些已经完成它们的执行的任务的Future对象,所以,这些Future对象只能获取任务的结果。

    在这个指南中,你将学习如何使用CompletionService类把执行者启动任务和处理它们的结果分开。

    准备工作…

    这个指南的例子使用Eclipse IDE实现。如果你使用Eclipse或其他IDE,如NetBeans,打开它并创建一个新的Java项目。

    如何做…

    按以下步骤来实现的这个例子:

    1.创建ReportGenerator类,并指定其实现Callable接口,参数化为String类型。

    public class ReportGenerator implements Callable<String> {

    2.声明两个私有的、String类型的属性,sender和title,用来表示报告的数据。

    private String sender; private String title;

    3.实现这个类的构造器,初始化这两个属性。

    public ReportGenerator(String sender, String title){ this.sender=sender; this.title=title; }

    4.实现call()方法。首先,让线程睡眠一段随机时间。

    @Override public String call() throws Exception { try { Long duration=(long)(Math.random()*10); System.out.printf("%s_%s: ReportGenerator: Generating a report during %d seconds\n",this.sender,this.title,duration); TimeUnit.SECONDS.sleep(duration); } catch (InterruptedException e) { e.printStackTrace(); }

    5.然后,生成一个有sender和title属性的字符串的报告,返回这个字符串。

    String ret=sender+": "+title; return ret; }

    6.创建ReportRequest类,实现Runnable接口。这个类将模拟一些报告请求。

    public class ReportRequest implements Runnable {

    7.声明私有的、String类型的属性name,用来存储ReportRequest的名称。

    private String name;

    8.声明私有的、CompletionService类型的属性service。CompletionService接口是个参数化接口,使用String类型参数化它。

    private CompletionService<String> service;

    9.实现这个类的构造器,初始化这两个属性。

    public ReportRequest(String name, CompletionService<String> service){ this.name=name; this.service=service; }

    10.实现run()方法。创建1个ReportGenerator对象,并使用submit()方法把它提交给CompletionService对象。

    @Override public void run() { ReportGenerator reportGenerator=new ReportGenerator(name,"Report"); service.submit(reportGenerator); }

    11.创建ReportProcessor类。这个类将获取ReportGenerator任务的结果,指定它实现Runnable接口。

    public class ReportProcessor implements Runnable {

    12.声明一个私有的、CompletionService类型的属性service。由于CompletionService接口是个参数化接口,使用String类作为这个CompletionService接口的参数。

    private CompletionService<String> service;

    13.声明一个私有的、boolean类型的属性end。

  • 原文来自 教程网 转载请注明:http://www.websmill.com/chengxu/java/32334.html

  • 上一篇:线程执行者(十)执行者控制一个任务完成
  • 下一篇:没有了