Настройка:
Я нахожусь в процессе изменения способа работы программы под капотом. В текущей версии работает так:
public void threadWork( List<MyCallable> workQueue )
{
ExecutorService pool = Executors.newFixedThreadPool(someConst);
List<Future<myOutput>> returnValues = new ArrayList<Future<myOutput>>();
List<myOutput> finishedStuff = new ArrayList<myOutput>();
for( int i = 0; i < workQueue.size(); i++ )
{
returnValues.add( pool.submit( workQueue.get(i) ) );
}
while( !returnValues.isEmpty() )
{
try
{
// Future.get() waits for a value from the callable
finishedStuff.add( returnValues.remove(0).get(0) );
}
catch(Throwable iknowthisisbaditisjustanexample){}
}
doLotsOfThings(finsihedStuff);
}
Но новая система собирается использовать закрытый внутренний Runnable для вызова синхронизированного метода, который записывает данные в глобальную переменную. Моя основная настройка:
public void threadReports( List<String> workQueue )
{
ExecutorService pool = Executors.newFixedThreadPool(someConst);
List<MyRunnable> runnables = new ArrayList<MyRunnable>()
for ( int i = 0; i < modules.size(); i++ )
{
runnables.add( new MyRunnable( workQueue.get(i) );
pool.submit(threads.get(i));
}
while( !runnables.isEmpty() )
{
try
{
runnables.remove(0).wait(); // I realized that this wouldn't work
}
catch(Throwable iknowthisisbaditisjustanexample){}
}
doLotsOfThings(finsihedStuff); // finishedStuff is the global the Runnables write to
}
Если вы прочитаете мой комментарий во второй части кода, вы заметите, что я не знаю, как использовать wait (). Я думал, что это в основном похоже на thread.join (), но после прочтения документации я вижу, что это не так.
Я согласен с изменением некоторой структуры по мере необходимости, но базовая система работы, использование runnables, запись runnables в глобальную переменную и использование пула потоков являются требованиями.
Вопрос
Как я могу дождаться полного завершения пула потоков перед тем, как делать doLotsOfThings ()?