2017-01-05 23 views
0

我之前問過這個問題,但無法再次打開它,因爲我的更新沒有啓動重新打開過程。所以重新提交如何處理當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(); 
} 
+1

這是一個很奇怪的模式。你什麼時候_want_從'ThreadFactory'返回null?目標是什麼? – Gray

+0

線程在創建時建立到服務器的連接。如果連接嘗試失敗,那麼不應該創建線程,並且需要將線程池通知給線程池。我應該以另一種方式嘗試嗎? – user1213428

回答

2

你可以扔RuntimeException這感覺是一個明智的事情。

RuntimeException對於通常無法恢復的情況來說非常適合。例如,無法連接到數據庫就是其中一種情況的主要例子。基本上,在這種情況下你想說:「事情是真的錯了,並在一分鐘我無法處理您的請求 稍後再試」

RuntimeException S可在方法拋出即使Interface沒有聲明它們也是如此。所以你可以更新你的ThreadFactory實現拋出一個RuntimeException而不是返回null。您甚至可以創建一個特定的RuntimeException子類,以確保清楚您的應用程序中的錯誤是什麼,例如FailedToInitialiseThreadException

+0

是的,這是有效的。我試圖拋出一個Exception的子類之前,這打破了ThreadFactory.newThread()簽名。 – user1213428

2

您可以通過擴展的ThreadPoolExecutor和

重寫方法,其中的ThreadFactory被調用來獲得新的線程,你需要創建自定義的執行服務。

相關問題