Как портировать 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 пусть ваши потоки запускают какое-то событие, и один рабочий поток зарегистрирован для прослушивания этих событий).

Другие вопросы по тегам