我之前問過這個問題,但無法再次打開它,因爲我的更新沒有啓動重新打開過程。所以重新提交如何處理當ExecutorService ThreadFactory返回null而不是前綴時的情況
我的問題是如何讓ExecutorService意識到線程無效(空),而不必等待未來。
我有一個用例,當在ThreadFactory中創建一個線程時,如果線程無法正確設置(例如它無法連接到服務器),我想返回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();
}
這是一個很奇怪的模式。你什麼時候_want_從'ThreadFactory'返回null?目標是什麼? – Gray
線程在創建時建立到服務器的連接。如果連接嘗試失敗,那麼不應該創建線程,並且需要將線程池通知給線程池。我應該以另一種方式嘗試嗎? – user1213428