看张孝祥老师的Java多线程视频,复现其中的一个小案例
缓存对象类
public class Q {
private String name="unknown";
private String sex="unknown";
private boolean bFull=false;
public synchronized void put(String name,String sex) {
if (bFull) {
try {wait();} catch (Exception e) {e.printStackTrace();}
}
this.name=name;
this.sex=sex;
bFull=true;
notify();
}
public synchronized void get() {
if (!bFull) {
try {wait();} catch (Exception e) {e.printStackTrace();}
}
System.out.print(name);
try {Thread.sleep(1);} catch (InterruptedException e) {}
System.out.println(":"+sex);
bFull=false;
notify();
}
}
生产者类
public class Product implements Runnable {
Q q;
public Product(Q q) {
super();
this.q = q;
}
@Override
public void run() {
// TODO Auto-generated method stub
int i = 0;
while (true) {
// synchronized (q) {
// if (q.bFull) {
// try {
// q.wait();
// } catch (InterruptedException e) {
// }
// } else {
//
// if (i == 0) {
// q.name = "zhangsan";
// try {
// Thread.sleep(10);
// } catch (InterruptedException e) {
// }
// q.sex = "male";
// } else {
// q.name = "lisi";
// q.sex = "female";
// }
// q.bFull = true;
// q.notify();
// i = (i + 1) % 2;
// }
// }
if (i==0) {
q.put("zhangsan", "male");
}else {
q.put("lisi", "female");
}
i=(i+1)%2;
}
}
}
消费者类
public class Consume implements Runnable {
Q q;
public Consume(Q q) {
super();
this.q = q;
}
@Override
public void run() {
while (true) {
// synchronized (q) {
// if (!q.bFull) {
// try {q.wait();} catch (InterruptedException e) {}
// }else {
//
// System.out.println(q.name);
// System.out.println(q.sex);
// q.bFull=false;
// q.notify();
// }
// }
q.get();
}
}
}
测试类
public class ThreadTest {
public static void main(String[] args) {
Q q=new Q();
new Thread(new Product(q)).start();
new Thread(new Consume(q)).start();
}
}
生产者类循环向缓存对象类中依次修改对象的name和sex 为zhangsan,male和lisi,female。
消费者类不断向缓存对象类中取出name和sex的值。
测试类开启和两个线程。
两个线程交替运行。