5

これまで、私は自分のアプリケーションをスタンドアロン製品として使用していました。それで、ユーザーが「停止」ボタンを押したとき、私は電話System.exit(0);をしました、そしてそれは大丈夫でした。

これで、私のアプリケーションは別のプログラムから(プログラム的に)呼び出されます。ですから、それSystem.exit(0);は私のプロセスだけでなく、私のプログラムを開始した外部ソフトウェアも殺してしまうのではないかと心配しています。

では、外部ソフトウェアから対応するリクエストを受け取った場合にアプリケーションをシャットダウンする正しい方法は何ですか?私のアプリケーションはGUIアプリケーションです。したがって、ウィンドウを閉じたいのですが、プログラムによって実行されたすべてのプロセスも閉じたいのです。

追加した:

具体的には、プログラムによって開始されたすべてのスレッドを閉じたいと思います。私のプログラムはOSプロセスや他のプログラムを開始しません。

4

4 に答える 4

2

起動したスレッドがまだ処理中の場合、System.exit(0) を呼び出すとスレッドが強制終了されます。場合によっては、これによりアプリケーションが一貫性のない状態になる可能性があります。たとえば、スレッドがファイルを保存していたとします。

System.exit を呼び出す前に、スレッドがすべて終了しても問題がないことを確認する必要があります。

実行時間の長いスレッドでこれに使用できる手法の 1 つは、ポイズニングです。これを行うには、スレッドが適切に終了する必要があるというメッセージ、つまり poson メッセージをスレッドに送信します。それらがすべて停止したら、System.exit(0) を呼び出して Swing イベント処理スレッドを終了しても安全です。

ポイズニングを実装するにはさまざまな方法があります。スレッドがポイズニングされているかどうかを確認するグローバル フラグ変数を設定するか、Java 5 スレッド ライブラリを使用することができます。たとえば、この Javadoc を見ると、この手法への参照が見つかります。

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html

于 2010-04-21T16:41:22.897 に答える
0

残念ながら、これに対する「万能」の答えは、System.exitのドロップイン代替品です。

通常、終了する時間であることをすべてのスレッドに通知する何らかのフラグを設定し、スレッドがこのフラグを定期的にチェックするようにする必要があります。これにより、突然停止することなく正常にクリーンアップでき、効果が自分のコンポーネントに限定されるようになります。この場合、アプリケーションのメインスレッドもフラグを監視し、すべての「ワーカー」タイプのスレッドが終了するのを待ってから、アプリケーションのエントリポイントに到達するまでスタックの最後まで戻ります。

この質問はThread.stop、特にSystem.exitをより敬意のあるものに置き換えることに関して、非推奨の(etc)メソッドとあまり似ていません。その観点から、Thread.stop()が非推奨になったページが役立つかもしれません。

メインスレッドのスタックを巻き戻すために例外(のようなものと呼ばれるカスタムのものApplicationStopException)をスローすることは、それほど悪い考えではありません。これにより、コード全体で特別なロジックを処理する必要がなくなり、代わりに「メッセージ」が上位レベルに伝播され、プログラムを正常に終了するために必要なアクションを実行できます。

于 2010-04-21T16:53:44.537 に答える
0

プログラムがアプリケーション サーバーを他のユーザーと共有していない限り、呼び出しによって VM をシャットダウンすると、System.exit(0) すべてのスレッドが終了します。

From Javadoc System.exit 現在実行中の Java 仮想マシンを終了します)

編集: シャットダウンする前にクリーンアップ コードを実行する場合は、http://java.sun.com/j2se/1.4.2/docs/guide/lang/hook-design.html

于 2010-04-21T16:12:53.387 に答える
0

いつ停止する必要があるかをスレッドが認識できるように、フラグを立ててスレッドを停止することをお勧めします。GUI とウィンドウの場合は、frame.dispose() を呼び出すことができます。

System.exit() の場合、呼び出し元には影響しないと思います。実際の効果を確認してみてください。ただし、他の人が既に推奨しているように、そのように直接呼び出さないでください。スレッドを自動的に停止させてください。

于 2010-04-21T16:58:44.157 に答える