問題の定義:-
insert some values into Database
のすべてのタスクがExecutorService
そこでジョブの実行を終了したらすぐに実行する必要があります。言い換えると、insert into database
dbに挿入する必要があるものは、そこでタスクを終了するすべてのスレッドに依存しているため、すべてのタスクがそこでジョブの実行を終了した場合にのみ実行できます。
では、のすべてのタスクの実行が終了したかどうかを確認しExecutorService
てから、データベースへの挿入を開始するにはどうすればよいですか。
以下は、を使用してタスクを作成しているコードですThreadPoolExecutor
。
executorService = new ThreadPoolExecutor(
noOfThreads,
noOfThreads,
500L,
TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(noOfThreads),
new ThreadPoolExecutor.CallerRunsPolicy()
);
// Running for particular duration of time
while(System.currentTimeMillis() <= endTime) {
Command newCommand = getNextCommand();
Task nextRunnable = new Task(newCommand, existId, newId);
executorService.submit(nextRunnable); // Submit it for execution
}
/*
Previously I was inserting into database here, but it was wrong as it might be
possible that some threads are still in progress. And If I am inserting right here
into database, then some information I will be loosing for sure. So how can I check
whether all the tasks have finished executing and then I can insert into database.
*/
executorService.shutdown();
if (!executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS)) {
executorService.shutdownNow();
}
挿入に使用するコードは以下のとおりです-
// Inserting into Database when all the task have finished executing, currently I
for (Entry<Integer, LinkedHashMap<Integer, String>> entry : GUID_ID_MAPPING.entrySet()) {
pstatement = db_connection.prepareStatement(LnPConstants.UPSERT_SQL);
pstatement.setInt(1, entry.getKey());
pstatement.setString(2, entry.getValue().get(LnPConstants.CGUID_ID));
pstatement.setString(3, entry.getValue().get(LnPConstants.PGUID_ID));
pstatement.executeUpdate();
}
したがって、すべてのタスクの実行が終了した後、このforループをどこかに配置する必要があります。
アップデート:-
だからこのようなもの-
executorService.shutdown();
if (!executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS)) {
executorService.shutdownNow();
}
// Now Insert into Database when all the task have finished executing
for (Entry<Integer, LinkedHashMap<Integer, String>> entry : GUID_ID_MAPPING.entrySet()) {
pstatement = db_connection.prepareStatement(PDSLnPConstants.UPSERT_SQL);
pstatement.setInt(1, entry.getKey());
pstatement.setString(2, entry.getValue().get(PDSLnPConstants.CGUID_ID));
pstatement.setString(3, entry.getValue().get(PDSLnPConstants.PGUID_ID));
pstatement.executeUpdate();
}