如何将waitformultipleobjects移植到java?

f45qwnt8  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(368)

我有一些针对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);
  }
}

HDataAvailableEvent可以从不同的线程设置。如果处理了所有数据,则事件将重置,并且在调用waitformultipleobjects时,线程将挂起,直到新数据到达或线程退出的时间到来。
我已经在java中看到了question waitformultipleobjects,但它不适合我的情况,因为我不能在一个周期的迭代中处理所有的新数据,并且处理会在一些迭代中扩散。
提前谢谢!

30byixjq

30byixjq1#

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

0mkxixxg

0mkxixxg2#

一个似乎能满足您需求的简单解决方案如下:

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 ).

相关问题