当ExecutorService ThreadFactory返回null而不是thead时,如何处理这种情况

时间:2017-01-05 13:10:03

标签: java multithreading executorservice

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

我的问题是如何让ExecutorService直接意识到线程无效(null),而不必等待未来的获取。

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

当ExecutorService在可调用上运行提交并且ThreadFactory返回null时,代码将运行但将在future.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 个答案:

答案 0 :(得分:2)

您可以通过扩展ThreadPoolExecutor和

来创建自定义执行程序服务

覆盖方法,其中调用threadfactory来获取新线程,满足您的需要。

答案 1 :(得分:2)

你可以抛出RuntimeException感觉像是一件明智的事情。

RuntimeException非常适合通常无法恢复的情况。例如,无法连接到数据库是其中一种情况的主要示例。基本上在这种情况下你想说:

  

“有些事情确实是错误的,而且我无法处理你的问题   请求。稍后再试“

即使接口没有声明它们,也可以在方法实现中抛出

RuntimeException。因此,您可以更新ThreadFactory实现以抛出RuntimeException而不是返回null。您甚至可以创建一个特定的RuntimeException子类,以确保清楚您的应用程序中的错误,例如FailedToInitialiseThreadException