一生产者和一消费者
MyTack类
public class MyTack {
private List list =new ArrayList();
private Object lock;
public MyTack(Object lock) {
this.lock = lock;
}
public void push() {
try {
synchronized (lock) {
if (list.size() == 1) {
lock.wait();
}
lock.notify();
list.add(Math.random());
System.out.println("push="+list.size()+"==="+list.get(0));
}
} catch (Exception e){
e.printStackTrace();
}
}
public void pop() {
try {
synchronized (lock) {
if (list.size() == 0) {
lock.wait();
}
lock.notify();
System.out.println("pop="+list.size()+"====="+list.remove(0));
}
} catch (Exception e){
e.printStackTrace();
}
}
}
生产者线程
public class Producer extends Thread{
private MyTack myTack;
public Producer(MyTack myTack) {
this.myTack = myTack;
}
@Override
public void run() {
while (true){
myTack.push();
}
}
}
消费者
public class Consumer extends Thread{
private MyTack myTack;
public Consumer(MyTack myTack) {
this.myTack = myTack;
}
@Override
public void run() {
while (true) {
myTack.pop();
}
}
}
测试类
public class RunTest {
public static void main(String[] args) {
final Object o=new Object();
MyTack myTack = new MyTack(o);
Thread producer=new Producer(myTack);
Thread consumer=new Consumer(myTack);
producer.start();
consumer.start();
}
}
数组里面只能存在一个元素。
一生产者和多消费者
测试类
public class RunTest {
public static void main(String[] args) {
final Object o=new Object();
MyTack myTack = new MyTack(o);
Thread producer=new Producer(myTack);
Thread consumer=new Consumer(myTack);
Thread consumer2=new Consumer(myTack);
Thread consumer3=new Consumer(myTack);
producer.start();
consumer.start();
consumer2.start();
consumer3.start();
}
}
原因:多个wait状态的线程被唤醒,导致remove时报错
将上面临界区中if条件改为while判断,则每次唤醒之后,会重新判断一次条件是否满足。运行正常,但是会出现假死的状态,将notify改为notifyall
修正代码
public class MyTack {
private List list =new ArrayList();
private Object lock;
public MyTack(Object lock) {
this.lock = lock;
}
public void push() {
try {
synchronized (lock) {
while (list.size() == 1) {
lock.wait();
}
lock.notifyAll();
list.add(Math.random());
System.out.println("push="+list.size()+"==="+list.get(0));
}
} catch (Exception e){
e.printStackTrace();
}
}
public void pop() {
try {
synchronized (lock) {
while (list.size() == 0) {
lock.wait();
}
lock.notifyAll();
System.out.println("pop="+list.size()+"====="+list.remove(0));
}
} catch (Exception e){
e.printStackTrace();
}
}
}