实验目的:实现n个共享数据的线程同步
代码:`
package xiancheng;
class ShareData{
private char[] c=new char[4]; //n=4,可调
public char[] getC() {
return c;
}
public void setC(char[] c) {
this.c = c;
}
public static boolean Isfull(char[] c) {
for(int i=0;i<c.length;i++) {
if(c[i]==0) {
return false;
}
}
return true;
}
public static boolean Isempty(char[] c) {
for(int i=0;i<c.length;i++) {
if(c[i]!=0) {
return false;
}
}
return true;
}
public synchronized void putShareChar(char ch) {
if(Isfull(this.c)) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=0;i<this.c.length;i++) {
if(this.c[i]==0) {
this.c[i]=ch;
break;
}
}
notify();
}
public synchronized char getShareChar() {
if(Isempty(this.c)) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notify();
for(int i=0;i<this.c.length;i++) {
if(this.c[i]!=0) {
char ch1=this.c[i];
this.c[i]=0;
return ch1;
}
}
return 0;
}
}
class Producer extends Thread{
private ShareData s;
public Producer(ShareData s) {
this.s = s;
}
public void run() {
for(char ch='A';ch<='N';ch++) {
s.putShareChar(ch);
System.out.println("生产者生产:"+ch);
try {
Thread.sleep((int)Math.random()*100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Customer extends Thread{
private ShareData s;
public Customer(ShareData s) {
this.s = s;
}
public void run() {
char ch;
do {
ch=s.getShareChar();
System.out.println("消费者消费:"+ch);
try {
Thread.sleep((int)Math.random()*500);
} catch (InterruptedException e) {e.printStackTrace();}
}while(ch!='N');
}
}
public class nongchang {
public static void main(String[] args) {
ShareData s=new ShareData();
Producer producer=new Producer(s);
Customer customer=new Customer(s);
Thread p=new Thread(producer);
Thread c=new Thread(customer);
p.setPriority(Thread.MAX_PRIORITY);
c.setPriority(Thread.MAX_PRIORITY);
p.start();
c.start();
}
}
截图: