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 の呼び出し時にスレッドは、新しいデータが到着するか、スレッドが終了するまで中断されます。

Java で 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
            }
        });
    }

}

実際にはイベントはありませんが、ほぼ同じように機能します。処理キューにデータを追加したいですか?呼び出し て、キューの前のタスクが終了するprocessと、executorが処理します。Dataシャットダウンしますか?呼び出しstopexecutor、キューのすべての処理を終了しますが、それ以上の作業は受け入れません。(より突然の終了が必要な場合は、を使用してくださいExecutorService.shutdownNow)。

于 2009-11-03T09:25:38.560 に答える
0

WaitForMultipleObjectsWindowsAPI関数です。個人的には、単純なイベントを介してこれを実装します(呼び出す代わりにResetEvent、スレッドに何らかのイベントを発生させ、それらのイベントをリッスンするために1つのワーカースレッドを登録します)。

于 2009-11-03T09:05:01.643 に答える