2016-02-27 74 views
0

我有下面的代碼,其中第一我創建隨需應變的數據庫連接,然後在多線程共享它。這工作正常。現在,我想知道是否有可能跟蹤使用此數據庫連接的所有線程是否已完成執行,以便關閉數據庫連接。任何關於如何實現這一點的指導都會有所幫助。監測線程執行

Connection connection = null; 
    Properties connectionProperties = getProperties(); 

    for (int reqIdx = 0; reqIdx < requests.length(); reqIdx++) { 
      connection = DBonnection.getConnection(connectionProperties); 
      ConnectorRunner connectorRunner = null; 
      try { 
       connectorRunner = new ConnectorRunner(someConnector);    
       connectorRunner.setDBConnection(connection); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      executorService.execute(connectorRunner); 
    } 
+1

共享多個線程之間的單一dababase連接是一個壞,壞主意。你將如何處理交易?使用連接池。 –

+0

借調@JBNizet,結帳的Apache DBCP https://commons.apache.org/proper/commons-dbcp/ – Anil

+0

的連接需求基於用戶在運行時的特性,因此,我不能創建連接池。我正在共享連接,因爲線程將使用同步負載按順序使用連接。 – rufy

回答

1

最簡單的方法是利用標準JDK設施CountDownLatch。在你的主線程做

CountDownLatch doneSignal = new CountDownLatch(requests.length()); 

for (Request req : requests) { 
    ConnectorRunner connectorRunner = new ConnectorRunner(doneSignal); 
    connectorRunner.setConnection(DBonnection.getConnection()); 
    executorService.execute(connectorRunner); 
} 

doneSignal.await(); 
DBonnection.dispose(); 

的ConnectorRunner必須只需調用doneSignal.countDown()當它這樣做。

+0

我一直在尋找這樣的事情。工作完美!非常感謝@Raffaele – rufy

1

除了上面的評論,如果你想在你所有的線程完成時做一些事情,你可以採取下面的任何一種方法。

ExecutorService es = Executors.newCachedThreadPool(); 
for(int i=0;i<5;i++) 
    es.execute(new Runnable() { /* your task */ }); 
es.shutdown(); 
boolean finshed = es.awaitTermination(1, TimeUnit.MINUTES); 
// all tasks have finished or the time has been reached. 

OR

for (Thread thread : threads) { 
    thread.join(); 
} 

請注意,第二種方法將阻止當前線程。

+0

這是一個很好的答案,但請正確格式化您的代碼。 –

+0

我的不好,會做。 Stackoverflow應該有自動格式代碼功能。 :) – Anil

+0

@阿尼謝謝。在我的方法中,我無法關閉執行程序服務,因爲會有更多的請求到來,我只需要使用同一個db連接實例跟蹤一組線程,並在完成執行後關閉連接。 – rufy