javac++algorithmmultithreadingwaitformultipleobjects

How port WaitForMultipleObjects to Java?


I have some code in C++ for Windows and I intend to port it to Java. But unfortunately it is not so easy as I thought. Could someone help me, please?

Please, take a look at algorithm:

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 can be set from different threads. If all data is processed, then event resets and at calling WaitForMultipleObjects thread will suspend until new data arrives or time for thread exit comes.

I've already seen question Waitformultipleobjects in Java but it's not suitable for my situation because I can't process all new data in 1 cycle iteration and processing spreads over some iterations.

Thanks in advance!


Solution

  • A simple solution which would seem to fulfill your need is something like:

    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
                }
            });
        }
    
    }
    

    You don't really have any events, but it works more or less the same way. Want to add data to the processing queue? Call process and the executor will process your Data when it is finished with any previous tasks on the queue. Shutting down? Call stop and the executor will finish process everything on the queue, but will not accept any more work. (If you need a more abrupt end, use ExecutorService.shutdownNow).