2

私のアプリケーションでは、AWTのイベントディスパッチスレッド(EDT)で開始された一部のプロセスが、特定の状況下で中断される場合があります。次に、ユーザーからの入力を待ちます。残念ながら、プロセスがEDTに配置されているため、アプリケーション全体がフリーズし、ユーザーはプロセスを再起動できず、デッドロックが発生します。EDTを中断して、別のスレッドから新しいイベントポンプを起動する方法はありますか?その後、ユーザーはUIを操作できるようになります。

私がやろうとしていることは、コンポーネントが複雑であるためにダイアログが必要ないことを除けば、モーダルダイアログを開くのとほぼ同じように見えます。ルートペインのすぐ内側に表示したいです。そこで、java.awt.Dialogでどのように行われるかを見て、かなりよく理解しましたが、使用される最も重要なクラス(EventDispatchThread、SequencedEvent、...)は保護されているため、アクセスできません。


回答ありがとうございます。

具体的に説明します。私は実際に、自家製のスクリプト言語を組み込んだアプリケーションに取り組んでいます。この言語用のデバッガーを開発しています。デバッガー(すべてのデバッガーと同様)は、ブレークポイントに達するたびにスクリプトの実行を停止します。スクリプト化されたプロセスは、コード内の多くの場所(EDTを含む)からトリガーできるため、EDTからプロセスを削除することはできません。デバッガーUIをアプリケーションに埋め込みたい(正確にはサイドペインに)。したがって、ブレークポイントに達したときに、現在のスレッド(おそらく、主に言うまでもなくEDT)を中断する必要があり、少なくともデバッガーのUIは引き続き応答する必要があります。また、私はJDK 1.4の上で開発しているので、残念ながらJDK7を使用する方法はありません。

私が現在行っているのは、デバッガーが埋め込まれたJDialogを開くことです。すべて正常に動作しますが、私が言ったように、デバッガーをメインウィンドウに直接埋め込む必要があるため、このソリューションには完全には満足していません。

4

1 に答える 1

6

JDK7を使用している場合は、SecondaryLoopインターフェースを使用できます。このインターフェースのインスタンスは、EventQueue.createSecondaryLoopメソッドを介して作成できます

例を含む有益なブログ投稿がありましたが、サーバーは今のところオフラインのようです。

私はまだあなたの質問を完全に理解していないので、小さな編集。

ワーカースレッドからのユーザー入力を待機する場合は、このSwingUtilities.invokeAndWaitメソッドを使用してブロックメソッドを使用できます(たとえば、show aJOptionPaneを使用してユーザー入力を取得します)。invokeAndWaitワーカースレッドがRunnable原因で、EDTのが処理されるまで停止されます。EDTでブロック方法を使用して、ユーザーRunnableが入力を提供した場合にのみ終了するユーザー入力を取得する場合

于 2012-05-11T16:06:21.023 に答える