2017-06-25 7 views
0

Javaでは、子スレッドからメインスレッドにイベントを渡すにはどうすればいいですか?メインスレッドをフリーズすることなくスレッドをJavaで渡すにはどうしたらいいですか?

オンライン私は、shared thread-safe event FIFO queue(子供がイベントを置く場所)のイベントを無限ループでチェックしているメインスレッドに関係する解決策しか見つけることができませんでした。 その後、x秒の間スリープしてもう一度開始してください。

guiからイベントを処理できるなど、主なスレッドがアクティブで他の処理を行う必要があります。子スレッドで何かが発生した場合、メインスレッドは、例えば、.eventHappened()を呼び出さなければなりません。

+0

あなたが必要とするのは、何かがあるとき**イベント**をメイン**オブジェクト**に渡す**リスナー**スレッドです。このイベント・データは、リスナー・スレッドで処理されます。それ以外の場合は、メインスレッドがチェックを行う必要があります。いくつのユーザー名を使用していますか? – efekctive

+0

あなたのスレッディングモデルの詳細をお願いします。未加工スレッド?エグゼクティブ? AWT?スイング? SWT? – chrylis

+0

メインスレッドはすべてのGUI(Swing)を作成する場所です。もう一つは生のワーカースレッドで、ダウンロードして解析します。 あなたの答えはありがたいですが、リスナースレッドで同じ問題が発生しました。処理されたイベントをメインスレッドにどのように伝えますか? –

答えて

0

1)をワーカースレッドのワーカースレッドまたはプールがその実行方法にチェックされている着信作品同時キュー。

2)UIスレッドとは異なるリスナースレッドがループをチェックする作業完了キューを処理しました。リスナースレッドは、UI例外を回避するために、非同期ファシリティ/メソッドを使用してUIへの更新を呼び出します。

したがって、UIスレッドは着信する作業キューにイベントまたはデータを送ります。ワーカースレッドはそれを拾い上げ、作業を行い、結果を作業キューに送信します。

リスナースレッドは、作業完了キュー内の新しい項目をチェックし、結果をUIに非同期でポストします。

+0

この方法では、AWTディスパッチスレッドへの非同期アクセスが必要です。スペックはすべてのguiコードをそのスレッドから実行する必要があると言います。そこに行くには、SwintUtils.InvokeLaterを使用します。しかし、なぜ、メインスレッドから直接メソッドを呼び出すことができますか? AWTイベントディスパッチスレッドではなく、メインプログラムのスレッドの後にあります。私が間違っている? –

+0

AsyncInvokeは後で別の "仕事をする"キューですが、UIのメインスレッドです。これの内部は私たちにとって透明です。 – efekctive

+0

UIのメインスレッドは、最初にGUI要素を作成するスレッドですか? –

0

このように子スレッドを実際に使用する必要がある場合は、おそらく並行キューを使用する必要があります。

swingを使用している場合は、SwingUtilities.invokeLater()を使用してコードを実行できます。その後、子スレッドを手動で使用するのではなく、バックグラウンドスレッドで実行します。これはトリックを行う必要があるUI凍結を回避するために

関連する問題