gpt4 book ai didi

java - wait() - java 中的 notify() 机制以一种奇怪的方式发生故障

转载 作者:行者123 更新时间:2023-11-30 06:59:19 25 4
gpt4 key购买 nike

<分区>

我尝试在这里阅读一些类似问题的答案(我总是这样做)但没有找到(或不理解?)这个特定问题的答案。

我正在实现一个相当简单的消费者-生产者类,它从不同的线程接收元素到列表并重复使用它们。该类具有以下代码:

public class ProduceConsume implements Runnable
{

LinkedList<Integer> _list = new LinkedList<Integer>();

public synchronized void produce(Integer i)
{
_list.add(i);
notify();
}

public void run()
{
while(true)
{
Integer i = consume();

// Do something with the integer...
}
}

private synchronized Integer consume()
{
if(_list.size() == 0)
{
try
{
wait();
}
catch(InterruptedException e){}

return _list.poll();
}
}
}

问题是 - 它通常工作正常,但有时,执行到

return _list.poll();

列表仍然是空的。我无法理解它——我做错了什么吗?反复尝试轮询检测零长度列表的可运行线程不应该等待,并且仅在生产者方法完成后才被唤醒,从而使列表非空吗?

除了生产调用外,没有其他任何东西从外部“接触”类。可运行类上没有其他线程同步。

顺便说一句,出于多种原因,我希望使用自己的变体而不是 CopyOnWriteArrayList 等类。

谢谢!任何帮助将不胜感激。

P.S - 我没有多次使用等待通知,但在过去,当我使用它时,它起作用了。因此,如果我犯了一些巨大的愚蠢错误,我深表歉意!

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com