ホームページ > Java > &#&チュートリアル > Java で長時間実行されるタスクを実行するときに、SwingWorker はイベント ディスパッチ スレッドのブロックをどのように防ぐことができますか?

Java で長時間実行されるタスクを実行するときに、SwingWorker はイベント ディスパッチ スレッドのブロックをどのように防ぐことができますか?

Barbara Streisand
リリース: 2024-12-14 16:41:11
オリジナル
340 人が閲覧しました

How Can SwingWorker Prevent Blocking the Event Dispatch Thread When Performing Long-Running Tasks in Java?

Java の SwingWorker

イベント ディスパッチ スレッド (EDT) をブロックせずに Swing で長時間実行タスクを実行するには、SwingWorker の利用を検討してください。この記事は、「Java の別のクラスからの repaint の呼び出し」に関する以前の質問に関連する特定の使用例に対処することを目的としています。

SwingWorker について

SwingWorker を使用すると、タスクを非同期的に実行し、GUI の応答性を維持します。バックグラウンド タスクと EDT の間のデータ交換を処理します。

Java で SwingWorker を実装する

前のコードからヒントを得た次のコード スニペットを考えてみましょう。質問:

// **illustrates previous example**
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.SwingWorker;

public class SwingWorkerExample {

    private static void main(String[] args) {
        // Initialize GUI
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());

        // Create and add a button to trigger the SwingWorker
        JButton button = new JButton("Start Async Task");
        panel.add(button);
        f.add(panel);
        f.pack();
        f.setVisible(true);

        // SwingWorker to perform the task
        SwingWorker<Integer, Void> worker = new SwingWorker<Integer, Void>() {

            // executed on a background thread:
            @Override
            protected Integer doInBackground() throws Exception {
                // simulate a heavy task:
                Thread.sleep(3000); // replace with actual code...
                return 42; // return an integer result...
            }

            // executed on the EDT after doInBackground completes:
            @Override
            protected void done() {
                try {
                    // get the result of the SwingWorker:
                    int result = get();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        };

        // ActionListener for the button:
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // start the SwingWorker when the button is clicked:
                worker.execute();
            }
        });
    }
}
ログイン後にコピー

説明:

  • この例では、ボタンのクリックにより SwingWorker がトリガーされ、バックグラウンドで長時間実行タスクが実行されます。
  • タスクの実行中、GUI は応答し続けます。
  • タスクが完了すると、ワーカーは EDT で Done() メソッドを呼び出し、結果にアクセスできるようになります。
  • このアプローチにより、長時間実行される操作によって GUI がブロックされなくなります。

以上がJava で長時間実行されるタスクを実行するときに、SwingWorker はイベント ディスパッチ スレッドのブロックをどのように防ぐことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート