我在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个周期的迭代中处理所有新数据,并且在一些迭代中处理扩展。
提前致谢!
答案 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
}
});
}
}
你真的没有任何事件,但它的工作方式大致相同。想要将数据添加到处理队列中吗?调用process
,executor
将在完成队列中的任何先前任务后处理您的Data
。关机?调用stop
,executor
将完成队列中的所有操作,但不会再接受任何工作。 (如果您需要更加突然的结束,请使用ExecutorService.shutdownNow
)。
答案 1 :(得分:0)
WaitForMultipleObjects
是Windows API函数。我个人会通过简单的事件实现这个(而不是调用ResetEvent
让你的线程触发某种事件,并注册一个工作线程来监听这些事件。)