1

我有一些适用于 Windows 的 C++ 代码,我打算将它移植到 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 时线程将暂停,直到新数据到达或线程退出时间到来。

我已经在 J​​ava 中看到过Waitformultipleobjects问题,但它不适合我的情况,因为我无法在 1 个循环迭代中处理所有新数据,并且处理分布在一些迭代中。

提前致谢!

4

2 回答 2

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关闭?呼叫stop并且executor将完成处理队列中的所有内容,但不再接受任何工作。(如果您需要更突然的结束,请使用ExecutorService.shutdownNow)。

于 2009-11-03T09:25:38.560 回答
0

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

于 2009-11-03T09:05:01.643 回答