15

1.私のコードが私が持っているJPanelのある行にあると考えてください、私は自動的にEDTにいますか?

2. GUI、JPanelsまたは他のビュークラスに属していない他のすべてのクラス、単純な論理クラスについても同じ質問。

3.音楽を再生しているJPanelがある場合、音楽はイベントディスパッチスレッドまたはEDTではない他のスレッドで実行する必要があります(実行に問題はありませんでしたが、GUIをブロックしないため) EDTから)?

SwingUtilities.isEventDispatchThread()
注: Thanksを使用せずにそれを知る方法の一般的なルールが必要です

4

2 に答える 2

24
  1. いいえ。
  2. いいえ。
  3. バックグラウンドスレッド。

EDTの外部で実行されているコードがGUIクラスで定義されたメソッドを呼び出す場合、そのコードはEDTではなく、呼び出し元のスレッドで実行されます。

EDTで実行されているコードが非GUIクラスで定義されたコードを呼び出す場合、そのコードはEDTで実行されます。

別のスレッドを作成していない場合、呼び出し元のメソッドは、呼び出し元のコードが実行されているスレッドで実行されます。スレッドは、メソッドが定義されているクラスに対応していません。

EDTで実行されるメソッドは、ユーザーではなくSwingによって呼び出された場合のイベントリスナーです。(ただし、EDTから呼び出している場合はまだそうかもしれません。)

また、メソッド内のすべてのコードはEDTにRunnable.run()渡されSwingUtilities.invokeLater()invokeAndWait()EDTでも実行されます。

EDTから呼び出す通常のメソッドは、EDTで実行されます。

作成したから呼び出されたコードThread(スレッドを直接使用するか、、、ExecutorServiceまたはSwingWorker.doInBackground())はEDTにありません。プログラムのmain()メソッドもEDTにありません。

于 2011-10-22T23:50:45.350 に答える
9

私のコメントによると:他のすべてが失敗した場合、SwingUtilitiesクラスには次の静的メソッドがあります。SwingUtilities.isEventDispatchThread()

3)に関しては、間違いなくバックグラウンドスレッドを使用してください。

そして、私が知る限り、「一般的なルール」はありません。はい、GUIのコードはEDTにあるはずですが、どこかにバグがある場合は、通常はそうではありませんが、そうではない可能性があります。Swingリスナーについても同じです。

于 2011-10-22T23:22:32.600 に答える