我有下面的代码,首先我创建一个按需数据库连接,然后与多个线程共享它。这工作正常。现在,我想知道是否可以跟踪使用此数据库连接的所有线程是否已完成执行,以便我可以关闭数据库连接。关于如何实现这一目标的任何指导都会有所帮助。
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);
}
答案 0 :(得分: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();
}
请注意,第二种方法将阻止当前线程。
答案 1 :(得分: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()
。