Java
 Computer >> コンピューター >  >> プログラミング >> Java

SwingはJavaでスレッドセーフですか?


いいえ、 Java Swing コンポーネントはJavaではスレッドセーフではありません。

Swingコンポーネントがスレッドセーフではない理由

  • Java Swingがスレッドセーフではない主な理由の1つは、そのコンポーネントを拡張するタスクを簡素化することです。
  • Java Swingのもう1つの理由は、ロックの取得と解放、および状態の復元に伴うオーバーヘッドのため、スレッドセーフではありません。 。
  • 一部のJavaSwingコンポーネントメソッドは、 repaint()、revalidate()などのマルチスレッドアクセスをサポートします。 、および invalidate()メソッド JComponent クラス。

イベントディスパッチスレッド(EDT)

Java Swingコンポーネントには、イベントディスパッチスレッド(EDT )からのみアクセスできます。 コンポーネントが画面上でペイントできるようになったら。 EDT スレッド paint()などのコールバックメソッドを呼び出すスレッドです。 およびupdate() イベントリスナーiで定義されたイベントハンドラメソッドに加えて インターフェース。どのスレッドからでも安全に呼び出すことができるのは、スレッドセーフなメソッドだけです。ほとんどのSwingオブジェクトメソッドはスレッドセーフではないため、単一のスレッドである EDTから呼び出すことができます。 。

import javax.swing.*;
import java.awt.Dimension;
import java.awt.event.*;
public class EDTTest extends JPanel implements ActionListener {
   private static EDTTest myPanel;
   private static JFrame myFrame;
   public EDTTest() {
      super();
   }
   public Dimension getPreferredSize() {
      return new Dimension(500,425);
   }
   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }
   private static void createAndShowGUI() {
      myFrame = new JFrame("EDT Program");
      myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      myFrame.setLocationRelativeTo(null);
      myPanel = new EDTTest();
      myFrame.add(myPanel);
      initMenu();
      myFrame.setVisible(true);
   }
   private static void initMenu() {
      JMenuBar menuBar = new JMenuBar();
      myFrame.setJMenuBar(menuBar);
      JMenu file = new JMenu("File");
      JMenuItem quit = new JMenuItem("Quit");
      quit.addActionListener(myPanel);
      file.add(quit);
      menuBar.add(file);
   }
   public void actionPerformed(ActionEvent ae) {
      String choice = ae.getActionCommand();
      if (choice.equals("Quit")) {
         System.exit(0);
      }
   }
}

上記の例では、 SwingUtilities.invokeLater() メソッドは、最初のスレッドのタスクが完了するまでGUI作成タスクを遅らせ、その後、GUI作成がEDT内で行われることを確認します。

出力

SwingはJavaでスレッドセーフですか?


  1. JavaでのJavaSwingのアーキテクチャを説明しますか?

    Java Swing は、グラフィカルユーザーインターフェイス( GUI )を提供するAPIのセットです。 )Javaプログラムの場合。 Java Swingは、 Abstract Windows Toolkと呼ばれる以前のAPIに基づいて開発されました。 それ(AWT)。 Java Swingは、AWTよりも豊富で洗練されたGUIコンポーネントを提供します。 GUIコンポーネントは、単純なレベルから複雑なまでさまざまです。 ツリー およびテーブル 。 Java Swingは、プラグ可能なルックアンドフィールを提供します 基盤となるプラットフォームから独立したJavaプログラムのルックアンド

  2. JavaでSwingコンポーネントが軽量であるのに、なぜAWTコンポーネントは重量があるのですか?

    AWT Abstract Window ToolKitの略で、JavaGUIプログラミングをサポートします。これは、スタンドアロンJavaアプリケーション/アプレット用のポータブルGUIライブラリです。 AWTは、 Java Swing を使用しながら、アプリケーションとネイティブGUI間の接続を提供します。 AWTテクノロジーに基づいて構築された一連のGUIコンポーネントを実装し、プラグイン可能なルックアンドフィールを提供できます。 。 Java Swingは、完全にJavaプログラミング言語で実装されています。 まず、重量が大きいということは、コードの読み込みに比較的時間がかかり、より多