多线程同步
实现两个并行执行的线程的数据同步
(使用Java同步机制)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
| public class EmuExe { public static void execute() { try { Thread.sleep((int) Math.random() * 1000); } catch (Exception e) { System.out.println("Exception!"); } } }
public class ThreadSync { public static void main(String[] args) { Object lock = new Object(); Flag flag = new Flag(true); ThreadA thread1 = new ThreadA(lock, flag); ThreadB thread2 = new ThreadB(lock, flag); thread1.start(); thread2.start(); } } class Flag { public boolean flag;
public Flag (boolean flag) { this.flag = flag; } }
class ThreadA extends Thread { public static volatile int A = 0; private final Object lock; private Flag flag;
public ThreadA(Object lock, Flag flag) { this.lock = lock; this.flag = flag; }
@Override public void run() { for(int i = 0; i < 100; i++) {
if(ThreadA.A + ThreadB.B != 100) { System.out.println("Error!"); } System.out.println("the value of A is " + A);
synchronized (lock) { flag.flag = !flag.flag; if (flag.flag) { lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } }
incA();
if (i != 99) { synchronized (lock) { flag.flag = !flag.flag; if (flag.flag) { System.out.println("waiting A"); lock.notify(); } else {
try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); }
} } } } }
private void incA() { A++; EmuExe.execute(); } }
class ThreadB extends Thread { public static volatile int B = 100; private final Object lock; private Flag flag;
public ThreadB(Object lock, Flag flag) { this.lock = lock; this.flag = flag; }
@Override public void run() { for(int i = 0; i < 100; i++) {
if(ThreadA.A + ThreadB.B != 100) { System.out.println("Error"); }
System.out.println("the value of B is " + B); synchronized (lock) { flag.flag = !flag.flag; if (flag.flag) { lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } }
decB();
if (i != 99) { synchronized (lock) { flag.flag = !flag.flag; if (flag.flag) { System.out.println("waiting B"); lock.notify(); } else {
try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); }
} } } } }
private void decB() { B--; EmuExe.execute(); } }
|