10 秒ごとに実行されるスケジュールされたタスクと、静的共通マップを実際に更新する 3 つのスレッドを含むスレッド プールがあります。スケジュールされたアクションは 10 秒ごとにこのマップを出力します。問題は、3 つのスレッドがマップで終了した後にスケジューラに印刷を停止させたいことです。しかし、ここに鍵があります。スケジューラをすぐに停止したくありません。最初に印刷 (マップの最終バージョン) してから終了したいと考えています。
public class myClass implements ThreadListener {
public static ArrayList<Pair<String, Integer>> wordOccurenceSet = new ArrayList<Pair<String, Integer>>();
int numberOfThreads = 0;
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public void getAnswer(Collection<CharacterReader> characterReaders, Outputter outputter) {
ExecutorService executor = Executors.newFixedThreadPool(characterReaders.size());
OutputterWriteBatch scheduledThread = new OutputterWriteBatch(outputter,wordOccurenceSet);
scheduler.scheduleAtFixedRate(scheduledThread, 10, 10, TimeUnit.SECONDS);
for (CharacterReader characterReader : characterReaders) {
NotifyingRunnable runnable = new CharacterReaderTask(characterReader, wordOccurenceSet);
runnable.addListener(this);
executor.execute(runnable);
}
}
@Override
public void notifyRunnableComplete(Runnable runnable) {
numberOfThreads += 1;
if(numberOfThreads == 3 ){
//All threads finished... What can I do to terminate after one more run?
}
}
}
Listener は、実際には、スレッドが終了したときに通知を受けるだけです。