Как портировать WaitForMultipleObjects на Java?
У меня есть код на C++ для Windows, и я собираюсь перенести его на Java. Но, к сожалению, это не так просто, как я думал. Может ли кто-нибудь помочь мне, пожалуйста?
Пожалуйста, взгляните на алгоритм:
HANDLE hExitEvent;
HANDLE hDataAvailabeEvent;
while(true)
{
WaitForMultipleObjects();
if (hExitEvent is set)
break;
if (hDataAvailabeEvent)
{
process chunk of data;
if (all data processed)
ResetEvent(hDataAvailabeEvent);
}
}
hDataAvailabeEvent может быть установлен из разных потоков. Если все данные обработаны, событие сбрасывается и при вызове потока WaitForMultipleObjects приостанавливается до тех пор, пока не поступят новые данные или не наступит время выхода из потока.
Я уже видел вопрос Waitformultiplepleobjects в Java, но он не подходит для моей ситуации, потому что я не могу обработать все новые данные в 1 цикле итерация и обработка распространяется на несколько итераций.
Заранее спасибо!
2 ответа
Простое решение, которое может удовлетворить ваши потребности, выглядит примерно так:
class DataProcessor implements Runnable {
private final ExecutorService executor =
Executors.newSingleThreadedExecutor();
public void stop { executor.shutdown(); }
public void process(final Data data){
executor.execute(new Runnable(){
public void run(){
// process data
}
});
}
}
У вас действительно нет никаких событий, но это работает примерно так же. Хотите добавить данные в очередь обработки? Вызов process
и executor
обработает ваш Data
когда это закончено с любыми предыдущими задачами в очереди. Выключение? Вызов stop
и executor
завершит обработку всего в очереди, но больше не будет принимать работу. (Если вам нужен более резкий конец, используйте ExecutorService.shutdownNow
).
WaitForMultipleObjects
это функция Windows API Лично я бы реализовал это с помощью простых событий (вместо вызова ResetEvent
пусть ваши потоки запускают какое-то событие, и один рабочий поток зарегистрирован для прослушивания этих событий).