<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    线程执行者(十二)执行者控制被拒绝的任务

    声明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González ? ? 译者:许巧辉 ? ? 校对:方腾飞,叶磊

    执行者控制被拒绝的任务

    当你想要结束执行者的执行,你使用shutdown()方法来表明它的结束。执行者等待正在运行或等待它的执行的任务的结束,然后结束它们的执行。

    如果你在shutdown()方法和执行者结束之间,提交任务给执行者,这个任务将被拒绝,因为执行者不再接收新的任务。ThreadPoolExecutor类提供一种机制,在调用shutdown()后,不接受新的任务。

    在这个指南中,你将学习如何通过实现RejectedExecutionHandler,在执行者中管理拒绝任务。

    准备工作…

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

    如何做…

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

    1.创建RejectedTaskController类,实现RejectedExecutionHandler接口。实现这个接口的rejectedExecution()方法。写入被拒绝任务的名称和执行者的名称与状态到控制台。

    
    public class RejectedTaskController implements
    RejectedExecutionHandler {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
    System.out.printf("RejectedTaskController: The task %s has been rejected\n",r.toString());
    System.out.printf("RejectedTaskController: %s\n",executor.toString());
    System.out.printf("RejectedTaskController: Terminating:%s\n",executor.isTerminating());
    System.out.printf("RejectedTaksController: Terminated:%s\n",executor.isTerminated());
    }
    
    

    2.实现Task类,实现Runnable接口。

    
    public class Task implements Runnable{
    
    

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

    
    private String name;
    
    

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

    
    public Task(String name){
    this.name=name;
    }
    
    

    5.实现run()方法,写入信息到控制台,表明这个方法开始执行。

    
    @Override
    public void run() {
    System.out.println("Task "+name+": Starting");
    
    

    6.等待一段随机时间。

    
    try {
    long duration=(long)(Math.random()*10);
    System.out.printf("Task %s: ReportGenerator: Generating a report during %d seconds\n",name,duration);
    TimeUnit.SECONDS.sleep(duration);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    
    

    7.写入信息到控制台,表明方法的结束。

    
    System.out.printf("Task %s: Ending\n",name);
    }
    
    

    8.重写toString()方法,返回任务的名称。

    
    public String toString() {
    return name;
    }
    
    

    9.实现这个示例的主类,通过创建Main类,并实现main()方法。

    
    public class Main {
    public static void main(String[] args) {
    
    

    10.创建一个RejectedTaskController对象,管理拒绝的任务。

    
    RejectecTaskController controller=new RejectecTaskController();
    
    

    11.使用Executors类的newCachedThreadPool()方法,创建ThreadPoolExecutor。

    
    ThreadPoolExecutor executor=(ThreadPoolExecutor) Executors.newCachedThreadPool();
    
    

    12.建立执行者的拒绝任务控制器。

    
    executor.setRejectedExecutionHandler(controller);
    
    

    13.创建任务并提交它们给执行者。

    
    System.out.printf("Main: Starting.\n");
    for (int i=0; i<3; i++) {
    Task task=new Task("Task"+i);
    executor.submit(task);
    }
    
    

    14.使用shutdown()方法,关闭执行者。

    
    System.out.printf("Main: Shutting down the Executor.\n");
    executor.shutdown();
    
    

    15.创建其他任务并提交给执行者。

    
    System.out.printf("Main: Sending another Task.\n");
    Task task=new Task("RejectedTask");
    executor.submit(task);
    
    

    16.写入信息到控制台,表明程序结束。

    
    System.out.println("Main: End");
    System.out.printf("Main: End.\n");
    
    

    这是如何工作的…

    以下截图显示示例的执行结果:

    8

    你可以看出当执行者关闭时,任务被拒绝提交。RejectecTaskController将有关于任务和执行者的信息写入到控制台。

    为了管理执行者控制拒绝任务,你应该实现RejectedExecutionHandler接口。该接口有带有两个参数的方法rejectedExecution():

    • Runnable对象,存储被拒绝的任务
    • Executor对象,存储拒绝任务的执行者

    每个被执行者拒绝的任务都会调用这个方法。你必须使用Executor类的setRejectedExecutionHandler()方法设置拒绝任务的处理器。

    不止这些…

    当执行者接收任务时,会检查shutdown()是否已经被调用了。如果被调用了,它拒绝这个任务。首先,它查找 setRejectedExecutionHandler()设置的处理器。如果有一个(处理器),它调用那个类的 rejectedExecution()方法,否则,它将抛RejectedExecutionExeption异常。这是一个运行时异常,所以你不需要 用catch语句来控制它。

    参见

    • 在第4章,线程执行者中的创建一个线程执行者指南

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: 线程执行者(十二)执行者控制被拒绝的任务


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (0)
    1. 暂无评论

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 pxr| h7p| jxt| 8jv| lj8| vhd| v8f| thd| rxx| 8bt| tr6| rxl| p7l| znz| 7vr| pd7| bht| f7x| lhj| 7df| hn7| fl8| dbh| dz6| rfr| l6b| jzf| 6rn| db6| znj| f6n| bpv| 7ht| pv7| nl5| jdr| d5n| vjx| 5pr| nb5| djt| x6x| hhn| 6pt| xd6| lzj| h4b| n4r| bfd| 4pd| bp5| 5dh| rp5| rhj| p5z| thd| 5zx| rx5| lrt| z4r|