package com.asmn.test;
import static com.asmn.tools.Tools.*;
public class Test {
public static void main(String[] args){
Signal signal = new Signal();
pl("start writer");
new Thread(new Writer(3,signal)).start();
pl("start reader");
new Thread(new Reader(2,signal)).start();
}
}
package com.asmn.test;
import static com.asmn.tools.Tools.*;
public class Writer implements Runnable {
public static final String className = "W";
private int sum;
private Signal signal;
public Writer(int sum, Signal signal){
this.sum = sum;
this.signal = signal;
}
@Override
public void run(){
boolean flag = true;
int n = 1;
while(flag){
try {
//判断资源是否被占用
while(signal.getSignal()){
signal.doWait(className);
}
//资源使用
signal.setSignal(true);
pl(n+"w--->A");
//结束资源使用
signal.setSignal(false);
pl((n++)+"w--->B");
signal.doNotify();
flag = n > sum ? false : true;
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
pl("over writer");
}
}
package com.asmn.test;
import static com.asmn.tools.Tools.*;
public class Reader implements Runnable {
public static final String className = "R";
private int sum;
private Signal signal;
public Reader(int sum, Signal signal){
this.sum = sum;
this.signal = signal;
}
@Override
public void run(){
boolean flag = true;
int n = 1;
while(flag){
try {
//判断资源是否被占用
while(signal.getSignal()){
signal.doWait(className);
}
//资源使用
signal.setSignal(true);
pl(n+"R--->A");
//结束资源使用
signal.setSignal(false);
pl((n++)+"R--->B");
signal.doNotify();
flag = n > sum ? false : true;
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
pl("over reader");
}
}
package com.asmn.test;
import static com.asmn.tools.Tools.*;
public class Signal {
private Object lock = new Object();
private boolean use = false;
public synchronized boolean getSignal(){
return this.use;
}
public synchronized void setSignal(boolean use){
this.use = use;
}
public void doWait(String className){
synchronized(lock){
try {
pl("文件正在被占用,等待... ----> " + className);
lock.wait();//当调用了wait()时,锁将被释放
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void doNotify(){
synchronized(lock){
lock.notify();
}
}
}
package com.asmn.tools;
public class Tools {
public static void pl(Object o){
System.out.println(o);
}
}
package com.asmn.test;import static com.asmn.tools.Tools.*;public class Test { public static void main(String[] args){ Signal signal = new Signal(); pl("start writer"); new Thread(new Write...