2

私は並行性について少し読んでいます(頭痛の種です)。

以下を使用して、メイン スレッドから EDT で実行するタスクを設定できることを理解しています。

SwingUtilities.invokeLater

しかし、EDT からメイン スレッドで実行するタスクを設定できますか?

次のように:

Thread mymainthread=Thread.currentThread();//<referring to the thread that initially kicks off public static void main

public void mousePressed(MouseEvent e){ //queue a task to run on mymainthread }

それはできますか?それは悪い考えですか?

これに似た SO に関する他の質問 (ここ) では、新しいスレッドの作成について説明していますが、シングル スレッド (+EDT) アプリケーションを目指している場合は、メインを使い続ける方が安全で簡単ではないでしょうか? ……あるいは、私はこれをすべて間違っているかもしれません。

編集: 説明すべきこと: メインスレッド (低速ループで実行) で互いに通信するオブジェクトを作成したかったので、別のスレッド、edt などでそれらのいずれかをインスタンス化したくありませんでした。

4

2 に答える 2

5

しかし、EDT からメイン スレッドで実行するタスクを設定できますか?

EDTとは何かについて混乱していると思います。Swing やその他の多くのフレームワークでは、スレッド制限と呼ばれる手法が使用されています。
スレッドセーフを保証するために、すべてのアクションは単一のスレッドから実行されます。Swing のこのスレッドは、Event Dispatcher Thread と呼ばれます。
このスレッドにはキューがあり、そのキューのすべてのタスクを同じスレッドで一度に 1 つずつ順番に実行します。これが、UI をブロックしないようにタスクを短くする必要がある理由です。
したがって、EDT を使用する場合、本質的にタスクをスレッドからそのキューに渡し、EDT は最終的にそれを実行します。
できることは、別のスレッドで実行されるスレッドを生成する EDT キューにタスクを置くことです。何らかの理由で現在のスレッドをバックグラウンド スレッドとして使用したい場合は、おそらく可能ですが、なぜそれが必要なのでしょうか? 最も簡単な方法は、プールの一部など、バックグラウンド スレッドの一部として実行するランナブルを送信することです。

于 2012-11-03T22:35:38.327 に答える
2

独自のイベント ループを作成して、スレッドの制限を行うことができます。これにより、EDT のように動作する個別の単一スレッドが可能になります。2 つのスレッド間で可変オブジェクトを [効果的に] 同時に共有しないように注意してください。

実装はwhileBlockingQueue. ExecutorServiceからを取得することで、少し高いレベルに進むことができますjava.util.concurrent.Executors.newFixeThreadPool(1)

于 2012-11-04T15:55:42.387 に答える