スレッドは Java プログラミングにおいて非常に重要な概念です。この記事では例を示しながら詳しく説明します。具体的な分析は次のとおりです。
まず第一に、スレッドロックは何に役立つのでしょうか?例: たとえば、現在銀行に 30,000 元があり、お金を引き出すために銀行に行く場合、パスワードを入力すると、すでに引き出し金額が入力されています。たとえば、20,000 と入力した場合、それは入力されています。ということは、銀行があなたの代わりにお金を引き出してくれるということです。そのとき、あなたの妻も銀行にお金を下ろしに行きました。この時点ではあなたの口座はまだ 30,000 なので、妻も 20,000 を引き出します。したがって、銀行はあなたの妻側でも同じ操作を実行します。このようにして、お二人がそれぞれの操作を完了した後でも、銀行の口座には 30,000 が記録されているはずです。 10,000元のデポジット、すごくないですか?この問題を解決するには、スレッドロックの知識を使用します。
1. 未処理のスレッド同期の例:
public class TextSync は Runnable{ /**未処理のスレッド同期* @param args */ Time time = new Time(); public static void main(String[] args) { TextSync text = new TextSync(); (テキスト); スレッド t2 = 新しいスレッド (テキスト); t2.setName("t2"); t2.start(); } @Override public void run() { time.add(Thread.currentThread().getName()); }}class Time { private static int num = 0; try { num++; //最初のスレッドがここまで実行されると、最初のスレッドは 1 秒間停止します。 //2 番目のスレッドがここまで実行されると、num は 2 になります。そして 2 番目のスレッドは 1 秒間一時停止します。 //この時点で最初のスレッドの番号も 2 になるため、最終的な結果は 2; Thread.sleep(1000) } catch (InterruptedException e) { e.printStackTrace() } System.out.println (name+) " は "+num+" 番目の実行スレッドです。");出力結果:
t2 は 2 番目の実行スレッドです。 t1 は 2 番目の実行スレッドです。
2. スレッドの同期
public class TextSynctwo は Runnable{ /**スレッド同期* @param args */ Time1 time = new Time1(); public static void main(String[] args) { TextSynctwo text = new TextSynctwo();テキスト); スレッド t2 = 新しいスレッド (テキスト); t1.setName("t2"); t1.start(); t2.start(); } @Override public void run() { time.add(Thread.currentThread().getName()); }}class Time1 { private static int num = 0; synchronized は現在のスレッドをロックします。これはメソッドの定義時に宣言することも、メソッド内で設定することもできます。 public synchronized void add(String name){ //synchronized (this) {//現在のスレッドをロックして、他のスレッドによって実行されないようにします try { Thread.sleep(1000) } catch (InterruptedException e) { e . printStackTrace(); } System.out.println(name+" は "+num+" 番目の実行スレッドです。");出力結果:
t1 は最初の実行スレッドです。 t2 は 2 番目の実行スレッドです。
3. デッドロック
public class TestDeadLock は Runnable{ /**Deadlock* @param args */ private int flag = 0; public static void main(String[] args ); { テストデッドロック td1 = 新しいテストデッドロック () td2 = 新しいテストデッドロック (); = 1; td2.flag = 2; スレッド t1 = 新しいスレッド t2 ("t1"); ; t2.start(); } @Override public void run() { System.out.println(Thread.currentThread().getName()); if(flag == 1){ synchronized(o1){ try { Thread.sleep(5000) } catch (InterruptedException e) { e.printStackTrace( ); } synchronized(o2){ System.out.println("1") } } } if(flag == 2); synchronized(o2){ try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized(o1){ System.out.println("2");4.ロック
public class TT は Runnable{ /**Lock* @param args */ int b = 100; public static void main(String[] args) { TT tt = new TT() th; .start(); 試してください { tt.m2() } キャッチ (例外 e) { e.printStackTrace() } System.out.println(tt.b); } @Override public void run() { try { m1(); } catch (Exception e) { e.printStackTrace() } } private synchronized void m1() throws Exception{ b = 1000; Thread.sleep(5000); System.out.println("b="+b); } プライベート同期 void m2() がスローされます。例外{ スレッド.スリープ(2500) b = 2500;現在の出力は次のようになります。
1000b=1000
m2 が最初に実行され、m2 が完了するまで m1 は実行できないことがわかります。
この記事が皆さんの Java プログラミング設計に役立つことを願っています。