当前位置: 首页 > 知识库问答 >
问题:

如何处理ExecutorService ThreadFactory返回null而不是thead的情况

左丘嘉言
2023-03-14

我以前问过这个问题,但无法再次打开它,因为我的更新没有启动重新打开的过程。所以重新提交

我的问题是如何让ExecutorService立即意识到线程无效(null),而不必等待将来的get。

我有一个用例,在ThreadFactory中创建线程时,如果无法正确设置线程(例如,它无法连接到服务器),我希望返回null。

当ExecutorService对可调用对象运行submit时,ThreadFactory返回null,如下所示,代码将运行,但将在将来等待。get(5,TimeUnit.SECONDS);然后抛出一个TimeoutException。问题是ThreadFactory.newThread()不允许我在这里抛出异常。

public class TestThreadFactory implements ThreadFactory {
    @Override
    public Thread newThread(Runnable r) {
        // try to create a conneciton that fails 
        // I cannot throw an exception here, so if there is a problem I have to  return null
        return null;
    }
}

public class ExecutorServicePool {

    public static ExecutorService getService() {
        return Executors.newFixedThreadPool(10, new TestThreadFactory());
    }
}

public static void main(String[] args) {
    ExecutorService executorService = ExecutorServicePool.getService();

    Callable callable = new Callable<String>() {
        @Override
        public String call() throws Exception {
            return "callable";
        }
    };

    Future<String> future = executorService.submit(callable);
    try {
        future.get(5, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (TimeoutException e) {
        e.printStackTrace();
    }
    executorService.shutdown();
}

共有2个答案

上官恩
2023-03-14

您可以通过扩展ThreadPoolExecutor和

根据需要重写调用threadfactory以获取新线程的方法

常雅珺
2023-03-14

你可以抛出一个运行时异常,这感觉是一件明智的事情。

对于通常不可恢复的情况,RuntimeExc0019非常有用。例如,无法连接到数据库就是其中一种情况的主要例子。基本上在这种情况下,你想说:

“出现问题,目前我无法处理您的请求。请稍后再试”

RuntimeExceptions可以在方法实现中抛出,即使接口没有声明它们。因此,您可以更新ThreadFactory实现以抛出RuntimeException而不是返回null。您甚至可以创建一个特定的RuntimeException子类,以确保清楚应用程序中的错误,例如FailedToInitialiseThreadException

 类似资料:
  • 代码段用于获取从文本文件中提取的一行文本,将其分离为单独的标记,并将每个标记存储在数组的索引中。起初我以为问题出在文本文件上,但是直接将字符串放入编辑器并不能解决这个问题。 使用字符串,如: 带分隔符的StringTokenizer对象返回前四个标记作为正确的字符串,但其余四个标记为null。 有趣的是,另一个字符串: “Gnollnonegeralany222taunttaunt” 鸡肉没有野兽

  • 问题内容: 我正在使用Oracle 11GR2,并且当varchar2字段为空时,在空字段上执行a 将显示在我的Eclipse控制台上。如何让它显示空字符串呢? 问题答案: 你的getter方法:

  • 问题内容: 我有三张桌子: 文字:行中的文字 trigram:所有文字行的trigram text_trigram:文本行包含的三字母组,中间表 当我执行此命令时: 结果出来了,却没有我想要的结果: 这是我除了拥有的东西: 此外,我想执行以下操作: 有可能的?还是使用运算符是错误的? 问题答案: 我认为这里的困惑是您假设的值为null ,但实际上 没有匹配的行 。考虑以下简化版本: 如果没有带有的

  • 有我的密码 我怎样才能得到异常原因?在我的例子中,如果我运行gradle,从命令行安装(没有jenkins)是:错误:不兼容的类型:不能转换为boolean 但我会在jenkins作业控制台输出中看到错误

  • 问题内容: 我的代码中有一个,如果地图的方法返回的是空列表而不是空值,则应避免使用空指针。java API中是否有类似的东西?我应该延长吗? 问题答案: @Jon的答案是直接处理您所要询问的好方法。 但是令我惊讶的是,您可能要实现的是“多图”;即从键到值集合的映射。如果是这种情况,那么您还应该查看Guava或Apache commons集合中的multimap类。 看着: 界面和它的实施方式中,或

  • 问题内容: 我正在使用具有以下签名的类: 我正试图通过其他班级来称呼它: 但是在这里我得到这个错误: 为什么在Class扩展行中将我指定为第三个参数? 问题答案: 您可以通过对返回的AsyncTask调用AsyhncTask的get()方法来获得结果,但是当它等待获取结果时,它将把它从异步任务变成同步任务。 由于您的AsyncTask位于单独的类中,因此您可以创建一个接口类并在AsyncTask中