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 @   七色angel  阅读(1037)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
点击右上角即可分享
微信分享提示