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(); } } }