Javaのオブジェクトレベルロックとクラスレベルロック?
public class ObjectLevelLockTest implements Runnable { @Override public void run() { objectLock(); } public void objectLock() { System.out.println(Thread.currentThread().getName()); synchronized(this) { System.out.println("Synchronized block " + Thread.currentThread().getName()); System.out.println("Synchronized block " + Thread.currentThread().getName() + " end"); } } public static void main(String[] args) { ObjectLevelLockTest test1 = new ObjectLevelLockTest(); Thread t1 = new Thread(test1); Thread t2 = new Thread(test1); ObjectLevelLockTest test2 = new ObjectLevelLockTest(); Thread t3 = new Thread(test2); t1.setName("t1"); t2.setName("t2"); t3.setName("t3"); t1.start(); t2.start(); t3.start(); } }
出力
t1 t2 t3 Synchronized block t1 Synchronized block t3 Synchronized block t1 end Synchronized block t3 end Synchronized block t2 Synchronized block t2 end
Javaのすべてのクラスには一意のロックがあります これはクラスレベルのロックに他なりません 。スレッドが静的同期メソッドを実行したい場合 、次にスレッドにはクラスレベルのロックが必要です 。スレッドがクラスレベルのロックを取得すると、静的同期メソッドを実行できるようになります そのクラスの。メソッドの実行が自動的に完了すると、スレッドはロックを解放します。 クラスレベルのロック 複数のスレッドが同期ブロックに入るのを防ぎます 実行時に使用可能なすべてのインスタンスのいずれかで。
例
public class ClassLevelLockTest implements Runnable { @Override public void run() { classLock(); } public void classLock() { System.out.println(Thread.currentThread().getName()); synchronized(ClassLevelLockTest.class) { System.out.println("Synchronized block " + Thread.currentThread().getName()); System.out.println("Synchronized block " + Thread.currentThread().getName() + " end"); } } public static void main(String[] args) { ClassLevelLockTest test1 = new ClassLevelLockTest(); Thread t1 = new Thread(test1); Thread t2 = new Thread(test1); ClassLevelLockTest test2 = new ClassLevelLockTest(); Thread t3 = new Thread(test2); t1.setName("t1"); t2.setName("t2"); t3.setName("t3"); t1.start(); t2.start(); t3.start(); } }
t3 t2 t1 Synchronized block t3 Synchronized block t3 end Synchronized block t2 Synchronized block t2 end Synchronized block t1 Synchronized block t1 end
-
JavaでのSwingWorkerクラスの重要性は何ですか?
SwingWorker クラスを使用すると、非同期を実行できます タスク ワーカースレッド(長時間実行タスクなど)で、イベントディスパッチスレッド(EDT )からSwingコンポーネントを更新します。 ) タスクの結果に基づきます。 Java1.6バージョンで導入されました。 SwingWorkerクラス java.swing.SwingWorker クラスはタスクワーカーであり、時間のかかるタスクをバックグラウンドで実行します。 SwingWorker インスタンスは3つのスレッドと相互作用します。現在 スレッド 、ワーカースレッド 、およびイベントディスパッチスレッド(E
-
JavaでのSwingUtilitiesクラスの重要性は何ですか?
Javaでは、Swingコンポーネントが画面に表示された後、それらはイベント処理スレッドと呼ばれる1つのスレッドでのみ操作できます。 。別のブロックにコードを記述し、このブロックにイベントへの参照を与えることができます 処理 スレッド 。 SwingUtilities クラスには、 invokeAndWait()という2つの重要な静的メソッドがあります。 およびinvokeLater() コードのブロックへの参照をイベントに配置するために使用します キュー 。 構文 public static void invokeAndWait(Runnable doRun) throws Interr