スレッド2-同時問題

9616 ワード

エディタのロード中...
 1 package com.test2;
2
3 public class Demo10_5 {
4
5 /**
6 * @param args
7 */
8 public static void main(String[] args) {
9
10 TicketWindow ticketWindow1 = new TicketWindow();
11 // TicketWindow ticketWindow2 = new TicketWindow();
12
13 Thread thread1 = new Thread(ticketWindow1);
14 Thread thread2 = new Thread(ticketWindow1);
15
16 thread1.start();
17 thread2.start();
18 }
19
20 }
21
22 //
23 class TicketWindow implements Runnable {
24 // 2
25 // private static int nums = 10;
26 private int nums = 10;
27
28 @Override
29 public void run() {
30 // TODO Auto-generated method stub
31 while (true) {
32 try {
33 Thread.sleep(1000);
34 } catch (Exception e) {
35 // TODO: handle exception
36 }
37 if (nums > 0) {
38 //
39 // :Thread.currentThread().getName()
40 System.out.println(Thread.currentThread().getName() + " "
41 + nums + " ");
42 --nums;
43 } else {
44 System.out.println(" !");
45 break;
46 }
47 }
48 }
49 }

結果:
Thread-1残り10枚Thread-0残り10枚Thread-1残り8枚Thread-0残り7枚Thread-0残り6枚Thread-1残り6枚Thread-1残り4枚Thread-0残り4枚Thread-0残り2枚Thread-1残り2枚チケットは完売!切符はもう売り切れました.
 
JAvaスレッドの同期.
JAvaの任意のタイプのオブジェクトには、0,1の2つの状態を有するフラグビットがあり、その開始状態は1である.あるスレッドがsynchronized(object)文を実行すると、objectオブジェクトのフラグビットは0状態になり、sysnchronized文のコードブロックが完全に実行されたことを知った後、そのオブジェクトのフラグビットはまた1状態に戻る.
1つのスレッドがsynchronized(object)文に実行されると、まずobjectオブジェクトのフラグビットをチェックし、0状態である場合、synchronizedに含まれるコードを実行している別のスレッドがあることを示すと、すでに別のスレッドが一時的にブロックされ、cpuリソースが別のスレッドが関連するコードを実行するまで速くなり、objectオブジェクトのフラグビットが1状態になると、このスレッドのブロックはキャンセルされ、スレッドは実行を継続することができ、objectのフラグビットを0状態にし、他のスレッドが関連する同期コードに入るのを防止する.
コードは次のとおりです.
package com.test2;

public class Demo10_5 {

/**
*
@param args
*/
public static void main(String[] args) {

TicketWindow ticketWindow1 = new TicketWindow();
// TicketWindow ticketWindow2 = new TicketWindow();

Thread thread1 = new Thread(ticketWindow1);
Thread thread2 = new Thread(ticketWindow1);

thread1.start();
thread2.start();
}

}

//
class TicketWindow implements Runnable {
// 2
// private static int nums = 10;
private int nums = 1000;

@Override
public void run() {
// TODO Auto-generated method stub
while (true) {

// if else [ ] this
synchronized (this) {

if (nums > 0) {
//
// :Thread.currentThread().getName()
System.out.println(Thread.currentThread().getName() + " "
+ nums + " ");
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
nums--;
} else {
System.out.println(" !");
break;
}

}
}
}
}

結果:
Thread-0はまだ1000枚の切符を残しているThread-0は999枚の切符を残しているThread-0は998枚の切符を残しているThread-0は997枚の切符を残しているThread-0は996枚の切符を残しているThread-0は995枚の切符を残しているThread-0は994枚の切符を残している.
.
.