之前我问过这个问题,但由于我的更新没有重新打开过程,因此无法再次打开它。所以重新提交
我的问题是如何让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();
}
答案 0 :(得分:2)
您可以通过扩展ThreadPoolExecutor和
来创建自定义执行程序服务覆盖方法,其中调用threadfactory来获取新线程,满足您的需要。
答案 1 :(得分:2)
你可以抛出RuntimeException感觉像是一件明智的事情。
RuntimeException
非常适合通常无法恢复的情况。例如,无法连接到数据库是其中一种情况的主要示例。基本上在这种情况下你想说:
即使接口没有声明它们,也可以在方法实现中抛出“有些事情确实是错误的,而且我无法处理你的问题 请求。稍后再试“
RuntimeException
。因此,您可以更新ThreadFactory
实现以抛出RuntimeException
而不是返回null。您甚至可以创建一个特定的RuntimeException
子类,以确保清楚您的应用程序中的错误,例如FailedToInitialiseThreadException