一消费者线程
package com.cyb.syn;
import java.util.List;
public class Consume implements Runnable {
private List container = null;
private int count;
public Consume(List lst) {
this.container = lst;//
}
public void run() {
while (true) {
synchronized (container) {
if (container.size() == 0) {//如过容器内部的物品数为0,则等待,直到生产者生产的物品数不为0。
try {
container.wait();// 放弃锁,让生产者执行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000);//等待1s
} catch (InterruptedException e) {
e.printStackTrace();
}
container.remove(0);//消费一个物品
container.notify();//唤醒等待线程(生产者)的线程
System.out.println("我吃了" + (++count) + "个");
}
}
}
/**
* 这里的公共资源为content,不同的线程都是用的是这一个资源,构成同步问题。
*/
}
二 生产者线程
package com.cyb.syn;
import java.util.List;
public class Product implements Runnable {
private List container = null;
private int count;
public Product(List lst) {
this.container = lst;
}
public void run() {
while (true) {
synchronized (container) {
if (container.size() > MultiThread.MAX) {//如果当前容器内生产的物品格式为最大值,则唤醒等待的线程(即消费者线程)
try {
container.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000);//等待1s中继续生产
} catch (InterruptedException e) {
e.printStackTrace();
}
container.add(new Object());
container.notify();//唤醒消费者线程
System.out.println("我生产了" + (++count) + "个");
}
}
}
}
三 测试生产者和消费者线程(消费者消费时,保证生产者生产有物品,否则等待消费者生产)
package com.cyb.syn;
import java.util.ArrayList;
import java.util.List;
public class MultiThread {
private List<String> container = new ArrayList<String>();
public final static int MAX = 3;
public static void main(String args[]) {
MultiThread m = new MultiThread();
new Thread(new Consume(m.getContainer())).start();
new Thread(new Product(m.getContainer())).start();
//new Thread(new Consume(m.getContainer())).start();
//new Thread(new Product(m.getContainer())).start();
}
public List getContainer() {
return container;
}
public void setContainer(List container) {
this.container = container;
}
}
四 测试结果
我生产了1个
我生产了2个
我生产了3个
我吃了1个
我吃了2个
我生产了4个
我生产了5个
我生产了6个
我吃了3个
我吃了4个
我吃了5个
我吃了6个
我生产了7个
我生产了8个
...
我生产了1个
我吃了1个
我生产了2个
我吃了2个
我生产了3个
我生产了4个
我生产了5个
我生产了6个
我吃了3个
我生产了7个
我吃了4个
我吃了5个
我吃了6个
我吃了7个
我生产了8个我生产了1个
我吃了1个
我生产了2个
我吃了2个
我生产了3个
我生产了4个
我生产了5个
我生产了6个
我吃了3个
我生产了7个
我吃了4个
我吃了5个
我吃了6个
我吃了7个
我生产了8个我生产了1个
我吃了1个
我生产了2个
我吃了2个
我生产了3个
我生产了4个
我生产了5个
我生产了6个
我吃了3个
我生产了7个
我吃了4个
我吃了5个
我吃了6个
我吃了7个
我生产了8个我生产了1个
我吃了1个
我生产了2个
我吃了2个
我生产了3个
我生产了4个
我生产了5个
我生产了6个
我吃了3个
我生产了7个
我吃了4个
我吃了5个
我吃了6个
我吃了7个
我生产了8个