1

すべてを実行しようとしている非常に忙しいスレッドが1つあり、MouseMotionListenerの速度が低下し始めています。リスナーを別のスレッドに入れて、常に可能な限り高速に実行されるようにすることを考えましたが、作成するとすぐに次のようになります。

import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class MouseListenerThread extends Thread implements MouseMotionListener {

    public void run(){
        //Concurrency happens here  
    }

    public void mouseDragged(MouseEvent e) {
        // Do something 
    }

    public void mouseMoved(MouseEvent e) {
        // Do something else
    }
}

この他のオブジェクトをマウスリスナーとして機能させることはできても、同時に行うことはできないことに気づきました。run関数を使用してリスニングを実現する方法はありますか?リスナーをスピードアップするための他の解決策も受け入れます。

ありがとう!

4

2 に答える 2

4

などを受信する実際のリスナーはmouseDragged、イベントディスパッチスレッド(EDT)上にある必要があります。これらのイベント処理メソッドで実行されている「非GUI」作業は、SwingWorkerまたは他のスレッドメソッドを使用して他のスレッドにファームオフできます。

すべてのGUI作業はイベントディスパッチスレッド内にある必要があるため、GUIの問題が原因でイベントハンドラーの速度が低下している場合は問題が発生する可能性がありますが、SwingUtilities.InvokeLater任意のスレッドをトリガーしてEDTスレッドの作業をスケジュールできます。を使用することもできますInvokeAndWaitが、それはあなたのGUIを裏付けのあるものに非常に緊密に結合し始めています...

于 2013-03-08T22:33:23.393 に答える
2

すべてのイベントは、イベントディスパッチスレッドによってディスパッチされます。マウスリスナーを別のスレッドに配置しても、イベントメソッドはEDTのコンテキスト内で通知されるため、まったく違いはありません。

Swingはシングルスレッドのフレームワークです。これは、UIとのすべての対話をEDTコンテキスト内から実行する必要があることを意味します。したがって、作業を別のスレッドにオフロードできたとしても、UIへの変更/更新をEDTで再同期する必要があります。

詳細については、Swingの並行性を読んでください。

EDT内で長時間実行/ブロックするタスクを実行している場合、yuはSwingWorker、を使用することを検討することをお勧めします。これにより、別のスレッドでタスクを実行できますが、UIの更新プロセスを簡素化する方法が提供されます。

于 2013-03-08T22:34:12.843 に答える