2016-02-27 69 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