处理 ThreadPoolExecutor 的异常

2024-01-27

我有以下代码片段,基本上扫描需要执行的任务列表,然后将每个任务交给执行器执行。

The JobExecutor依次创建另一个执行器(用于执行数据库操作...读取数据并将数据写入队列)并完成任务。

JobExecutor返回一个Future<Boolean>对于提交的任务。当其中一项任务失败时,我想优雅地中断所有线程并通过捕获所有异常来关闭执行器。我需要做哪些改变?

public class DataMovingClass {
    private static final AtomicInteger uniqueId = new AtomicInteger(0);

  private static final ThreadLocal<Integer> uniqueNumber = new IDGenerator();   

  ThreadPoolExecutor threadPoolExecutor  = null ;

   private List<Source> sources = new ArrayList<Source>();

    private static class IDGenerator extends ThreadLocal<Integer> {
        @Override
        public Integer get() {
            return uniqueId.incrementAndGet();
        }
  }

  public void init(){

    // load sources list

  }

  public boolean execute() {

    boolean succcess = true ; 
    threadPoolExecutor = new ThreadPoolExecutor(10,10,
                10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1024),
                new ThreadFactory() {
                    public Thread newThread(Runnable r) {
                        Thread t = new Thread(r);
                        t.setName("DataMigration-" + uniqueNumber.get());
                        return t;
                    }// End method
                }, new ThreadPoolExecutor.CallerRunsPolicy());

     List<Future<Boolean>> result = new ArrayList<Future<Boolean>>();

     for (Source source : sources) {
                    result.add(threadPoolExecutor.submit(new JobExecutor(source)));
     }

     for (Future<Boolean> jobDone : result) {
                try {
                    if (!jobDone.get(100000, TimeUnit.SECONDS) && success) {
                        // in case of successful DbWriterClass, we don't need to change
                        // it.
                        success = false;
                    }
                } catch (Exception ex) {
                    // handle exceptions
                }
            }

  }

  public class JobExecutor implements Callable<Boolean>  {

        private ThreadPoolExecutor threadPoolExecutor ;
        Source jobSource ;
        public SourceJobExecutor(Source source) {
            this.jobSource = source;
            threadPoolExecutor = new ThreadPoolExecutor(10,10,10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1024),
                    new ThreadFactory() {
                        public Thread newThread(Runnable r) {
                            Thread t = new Thread(r);
                            t.setName("Job Executor-" + uniqueNumber.get());
                            return t;
                        }// End method
                    }, new ThreadPoolExecutor.CallerRunsPolicy());
        }

        public Boolean call() throws Exception {
            boolean status = true ; 
            System.out.println("Starting Job = " + jobSource.getName());
            try {

                        // do the specified task ; 


            }catch (InterruptedException intrEx) {
                logger.warn("InterruptedException", intrEx);
                status = false ;
            } catch(Exception e) {
                logger.fatal("Exception occurred while executing task "+jobSource.getName(),e);
                status = false ;
            }
           System.out.println("Ending Job = " + jobSource.getName());
            return status ;
        }
    }
}   

当你向执行者提交任务时,它会返回一个FutureTask http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/FutureTask.html实例。

FutureTask.get() http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/FutureTask.html#get%28%29将重新抛出任务抛出的任何异常ExecutorException.

所以当你迭代List<Future>并在每个上调用 get,catchExecutorException并调用有序关闭。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理 ThreadPoolExecutor 的异常 的相关文章

随机推荐

  • 在 tkinter 中,有没有办法改变重叠画布的绘制堆栈顺序?

    问题 使用 Python 的 tkinter 我尝试通过扩展来创建自定义按钮和其他小部件画布小部件 http effbot org tkinterbook canvas htm when to use 当用户与它们交互时 如何更改在顶部绘制
  • Content-type 中的边界被 FormHttpMessageConverter 覆盖

    我在 Spring 框架中使用 FormHttpMessageConverter 为了通过restTemplate发送文件 我在项目中添加了FormHttpMessageConverter 问题是服务器获取文件询问我的加密内容类型的字符串
  • 如何在 Azure DevOps yaml 管道中的每个循环中使用变量

    我的 Azure DevOps 管道中有一个 PowerShell 脚本 task PowerShell 2 displayName Get records inputs targetType inline script lt gt rec
  • OpenID 的最佳 Coldfusion 库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 用于多图像上传的 Django Rest 框架

    我在使用 Django Rest Framework 上传多个图像时遇到了困难 我想要的是 有一个租赁表 用户可以在其中一次填写有关租赁信息以及多个图像 图像可以是厨房 客厅 浴室等 为了这笔租金 他们想登记 一份租金可以有多个图像 因此我
  • 使用 PHP 读取 JSON 数据 [重复]

    这个问题在这里已经有答案了 Solr 以以下 JSON 格式返回响应 responseHeader status 0 QTime 2 params indent on start 0 q wt json version 2 2 rows 1
  • 格式化 Netbeans 的大括号 [重复]

    这个问题在这里已经有答案了 我一直在查看 Netbeans 的选项 但找不到更改大括号默认位置的方法 public class foo to this public class foo Look in Tools gt Options gt
  • 5 规则(针对构造函数和析构函数)是否已经过时?

    5 规则指出 如果一个类具有用户声明的析构函数 复制构造函数 复制赋值构造函数 移动构造函数或移动赋值构造函数 则它必须具有其他 4 个 但今天我突然意识到 什么时候需要用户定义的析构函数 复制构造函数 复制赋值构造函数 移动构造函数或移动
  • Java Quartz 内存泄漏消息

    我的网络应用程序中有一个quartz 工作 它是由servlet 启动的 当我重新部署我的应用程序时 我收到以下消息 DefaultQuartzScheduler Worker 5 but has failed to stop it Thi
  • 如何向字符串添加双引号字符?

    如何向给定字符串添加双引号字符 local str foo 我怎样才能得到字符串 foo 其中字符串包含前导和尾随引号 您可以将引号粘贴到字符串上 local str foo print foo gt foo print foo gt fo
  • 角度 6 元素布尔输入参数

    我正在构建一个角元素并向其传递一些输入参数 我可以很好地传递一些字符串输入参数 ikrId 和环境工作完美 但很难通过角元素 将 showTitle 属性从父角度组件传递给组件效果很好 这是组件片段 export class MyCompo
  • 网络线程阻塞 GUI

    我正在研究 C 和 WPF 我正在开发一个应处理 LAN 上的数据传输的应用程序 特别是 每次传输都会显示进度条 如果是下载 则为绿色 如果是上传 则为红色 最初 我做了一些虚构的尝试 其中我模拟了传输 网络线程被停用 因此 以编程方式填充
  • 使用实体框架加入视图时使用 .Include() [重复]

    这个问题在这里已经有答案了 我使用索引视图 它是一个没有任何关系的实体 与我的表实体的关系会更好 但这似乎几乎不可能实现 该视图由 4 个 FK 组成 它们共同构成 PK PortalID CategoryID BranchID Compa
  • Rails 仅在有条件时才验证唯一性

    我有一个问题课 class Question lt ActiveRecord Base attr accessible user id created on validates uniqueness of created on scope
  • 创建自定义文本绘制视图

    我正在为 iPhone 创建一个语法荧光笔 为了显示多种格式的文本 我对 UIView 进行了子类化并修改了drawRect 方法 以便使用正确的语法突出显示显示每一行 突出显示是用 RegEx 提前完成的 文本是用CGContextSho
  • 获取网络浏览器控件的屏幕截图?

    关于这个问题有很多线索 但没有一个是明确的 而且我尝试过的任何一个实际上都没有工作正常 获取整个 Web 浏览器控件的内容 甚至是屏幕外的内容 的代码是什么 看起来他们确实有 webBrowser1 DrawToBitmap but its
  • 跨平台 SSO - 从哪里开始?

    我正在研究两个不同系统之间的单点登录选项 一个 NET 一个 Java EE 它们各自独立管理并具有单独的用户管理 并且存在一些重叠的用户 我希望能够从一个链接到另一个 而无需重新提示输入密码 SSO 产品和协议似乎有很多选择 我相当有信心
  • 如何过滤对象中的数组

    我的对象中有这些数组 我需要filter tags具有特定值的数组 我不知道如何实现这一目标 const obj slug add an aggregate rating feature to your website frontmatte
  • 无法使用 Debian squeeze 在 Sheevaplug (armv5t) 上构建节点

    我现在已经尝试了几种在运行 Debian 版本 6 0 2 squeeze 的 Sheevaplug armv5t 上构建节点 版本 0 5 1 的方法 但最终总是 node Illegal instruction 在所有情况下我都可以编译
  • 处理 ThreadPoolExecutor 的异常

    我有以下代码片段 基本上扫描需要执行的任务列表 然后将每个任务交给执行器执行 The JobExecutor依次创建另一个执行器 用于执行数据库操作 读取数据并将数据写入队列 并完成任务 JobExecutor返回一个Future