2

私のアプリケーションではExecutorService、固定サイズのを持っています1

これで、スレッドはいくつかのネイティブコードを呼び出します。ネイティブメソッド内では、ブロックされ、ディスパッチする必要のあるOSイベントを待機します。問題は、の正常なシャットダウンにありExecutorServiceます。

スレッドを中断しても、スレッドが出ません(明らかに)。スレッドを。として設定した場合daemon。それでも、JVMをシャットダウンすることはできません。私が持っている唯一の機能するコードはSystem.exit、明白な理由で私が使用するつもりのないものを使用しています。他の方法はありますか?

4

1 に答える 1

3

エラーは、返されないネイティブ コードにあります。私が知る限り、より高いレベルのJavaを介してそれを行う唯一の方法は、スレッドを使用することです-これはいくつかの理由stop()で非推奨です.

Threadこれを行うには、の代わりに昔ながらの を使用するように再設計する必要がありますExecutorService。サイズが 1 に固定されているため、ExecutorService多くの利点が得られないため、これを行うこともできます。stop()あなたの質問から私が見る限り、スレッドにロックを保持していない場合は、実行可能なオプションのように思えるかもしれませんstop()

編集:

Apple の開発者ガイド(47 ページ) によるとEventTimeout、呼び出し時に を指定できますReceiveNextEvent

ReceiveNextEvent は低レベルのイベント ループを実行し、発生したイベントをイベント キューに配置します。この関数は、指定したイベントが発生したとき、または指定したタイムアウトを超えたときに戻ります。

OSStatus ReceiveNextEvent(
UInt32 inNumTypes,
const EventTypeSpec *inList,
EventTimeout inTimeout,
Boolean inPullEvent,
EventRef *outEvent);

したがって、ネイティブコードを呼び出すときにタイムアウトを正しく設定することを理解していれば、うまくいくでしょう。

于 2013-03-22T10:50:27.490 に答える