如何将WaitForMultipleObjects端口转换为Java?

时间:2009-11-03 08:56:12

标签: java c++ algorithm multithreading waitformultipleobjects

我在C ++ for 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线程时将暂停,直到新数据到达或线程退出的时间到来。

我已经看过问题Waitformultipleobjects in Java,但它不适合我的情况,因为我不能在1个周期的迭代中处理所有新数据,并且在一些迭代中处理扩展。

提前致谢!

2 个答案:

答案 0 :(得分: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
            }
        });
    }

}

你真的没有任何事件,但它的工作方式大致相同。想要将数据添加到处理队列中吗?调用processexecutor将在完成队列中的任何先前任务后处理您的Data。关机?调用stopexecutor将完成队列中的所有操作,但不会再接受任何工作。 (如果您需要更加突然的结束,请使用ExecutorService.shutdownNow)。

答案 1 :(得分:0)

WaitForMultipleObjects是Windows API函数。我个人会通过简单的事件实现这个(而不是调用ResetEvent让你的线程触发某种事件,并注册一个工作线程来监听这些事件。)