current thread is not owner问题

看了网上得相应的解释,我发现网上大部分说的是要把wait和notifyAll放到一个大括号里,但是我找了找,我的问题不是这个

因为这两个方法需要获得锁,而我锁的是

 synchronized (list)

而我的wait方法只是用了wait方法,正确的使用应该是list.wait(),下面是整个的代码

import java.util.LinkedList;

import static java.lang.Thread.sleep;

public class Buffer {
    private final int MAX = 10;
    private LinkedList<Object> list = new LinkedList<>();

    /**
     *  @param value 生产产品的名字,是什么玩意
     * @param time 生产者生产花费的时间
     */
    public void product(int value, int time){
        synchronized (list){
            while(list.size() == MAX){
                System.out.println("仓库中已经放满"+MAX+"个仓品,达到上限,无法继续放入");
                try {
                    list.wait();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
                list.add(value);
//                try {
//                    sleep(time*1000);
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//                finally {
//                    System.out.println("生产者生产花费了"+time+"秒");
//                }
                System.out.println("生产者为:"+Thread.currentThread().getName()+"当前仓库容量为"+list.size());
                System.out.println("-------------------------------");
                list.notifyAll();

        }
    }

    /**
     * 相应的对应上面的生产者,基本代码没有任何区别
     * @param time
     */
    public void consumer(int time){
        synchronized (list){

                while(list.size() == 0){
                    System.out.println("仓库中已空,请等待生产者生产");
                    try {
                        list.wait();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                    list.remove();
//                    try {
//                        sleep(time*1000);
//                    } catch (Exception e) {
//                        e.printStackTrace();
//                    }
//                    finally {
//                        System.out.println("消费者消费花费了"+time+"秒");
//                    }
                    System.out.println("消费者为:"+Thread.currentThread().getName()+"当前仓库容量为"+list.size());
                    System.out.println("-------------------------------");
                    list.notifyAll();

            }

    }
}
全部代码

 

 

 

posted @ 2022-05-05 08:05  七色angel  阅读(856)  评论(0编辑  收藏  举报