【问题标题】:How port WaitForMultipleObjects to Java?如何将 WaitForMultipleObjects 移植到 Java?
【发布时间】:2009-11-03 08:56:12
【问题描述】:

我有一些适用于 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 时线程将暂停,直到新数据到达或线程退出时间到来。

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

提前致谢!

【问题讨论】:

    标签: java c++ algorithm multithreading waitformultipleobjects


    【解决方案1】:

    似乎可以满足您的需求的简单解决方案类似于:

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

    【讨论】:

    • 感谢 gustafc!我猜这是一个线程池。作为一种实现方式,它可以是,但你能告诉我吗:will statement executor.shutdown();优雅地完成“运行”方法?在 executor.shutdown() 的情况下,我可以明确告诉“运行”中使用的对象关闭吗?也许在“运行”内部会引发某种异常?
    • 不,run 将始终优雅地完成。 Java 并没有真正做突然的线程停止。正如shutdown 的文档所说,“已执行提交的任务,但不会接受新任务” - 不会接受新的工作项,但线程将继续运行,直到工作队列为空。至于shutdownNow,它让当前正在执行的Runnable 完成,但不会开始处理任何新项目。
    • 如果您希望能够在处理器关闭时中止当前正在执行的任务,您可以在run 的适当位置执行类似if (executor.isShutdown()) return; 的操作。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      • 2011-05-13
      • 2011-08-30
      相关资源
      最近更新 更多