3.1.10等待wait的条件变化

来源:互联网 发布:快三数据接口 编辑:程序博客网 时间:2024/06/05 05:08

package demo;import java.util.ArrayList;import java.util.List;/** * Created by sunyifeng on 17/10/16. */public class ValueObject {    public static List list = new ArrayList();}
package demo;/** * Created by sunyifeng on 17/10/16. */public class Add {    private String lock;    public Add(String lock) {        super();        this.lock = lock;    }    public void add() {        synchronized (lock) {            ValueObject.list.add("sunyf");            lock.notifyAll();        }    }}
package demo;import com.sun.tools.internal.ws.wsdl.document.soap.SOAPUse;/** * Created by sunyifeng on 17/10/16. */public class Subtract {    private String lock;    public Subtract(String lock) {        super();        this.lock = lock;    }    public void substract() {        try {            synchronized (lock) {                while (ValueObject.list.size() == 0) {                    System.out.println("等待开始,线程名称:" + Thread.currentThread().getName());                    lock.wait();                    System.out.println("等待结束,线程名称:" + Thread.currentThread().getName());                }                ValueObject.list.remove(0);                System.out.println("list的大小:" + ValueObject.list.size());            }        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
package demo;/** * Created by sunyifeng on 17/10/16. */public class ThreadAdd extends Thread {    private Add a;    public ThreadAdd(Add a) {        super();        this.a = a;    }    @Override    public void run(){        a.add();    }}
package demo;/** * Created by sunyifeng on 17/10/16. */public class ThreadSubtract extends Thread {    private Subtract s;    public ThreadSubtract(Subtract s) {        super();        this.s = s;    }    @Override    public void run(){        s.substract();    }}
package demo;/** * Created by sunyifeng on 17/10/16. */public class Run {    public static void main(String[] args) throws InterruptedException {        String lock = new String("");        // 加        Add add = new Add(lock);        // 减        Subtract subtract = new Subtract(lock);        // 减线程1        ThreadSubtract threadSubtract1 = new ThreadSubtract(subtract);        threadSubtract1.setName("threadSubtract1");        threadSubtract1.start();        // 减线程2        ThreadSubtract threadSubtract2 = new ThreadSubtract(subtract);        threadSubtract2.setName("threadSubtract2");        threadSubtract2.start();        // 沉睡        Thread.sleep(1000);        // 加线程(唤醒)        ThreadAdd threadAdd = new ThreadAdd(add);        threadAdd.setName("threadAdd");        threadAdd.start();    }}
运行结果:

等待开始,线程名称:threadSubtract1
等待开始,线程名称:threadSubtract2
等待结束,线程名称:threadSubtract2
list的大小:0
等待结束,线程名称:threadSubtract1
等待开始,线程名称:threadSubtract1

程序分析:

注意while语句,线程1执行remove,移除一个元素,线程2执行的时候while(true)变成死循环,不在往下执行。while改成if线程2会往下执行到remove(0)的时候报异常,因为list的大小为1,不能remove两次。

原创粉丝点击