/**
*
* 多个线程要操作的数据i要放在同步块里,这里是lock锁的同步块里了,对数据i的操作与数据i放在同一个类里了,体现了内聚性
**/
public classTest2{private int i = 0;
finalprivate Object LOCK = newObject();private volatile boolean isProduced = false;public voidproduce() {
synchronized (LOCK) {while(isProduced) {try{
LOCK.wait();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
i++;
System.out.println(Thread.currentThread().getName() + "生产 了" +i);
LOCK.notifyAll();
isProduced= true;
}
}public voidconsume() {
synchronized (LOCK) {while (!isProduced) {try{
LOCK.wait();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() +"消费了" +i);
LOCK.notifyAll();
isProduced= false;
}
}public static voidmain(String[] args) {
Test2 pc= newTest2();
Stream.of("P1", "P2", "P3").forEach(n ->
newThread(n) {
@Overridepublic voidrun() {while (true) {
pc.produce();try{
Thread.sleep(10);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}.start()
);
Stream.of("C1", "C2", "C3", "C4").forEach(n ->
newThread(n) {
@Overridepublic voidrun() {while (true) {
pc.consume();try{
Thread.sleep(10);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}.start()
);
}
}