gpt4 book ai didi

java - 并发求和列表,由另一个线程填充

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

Have a thread which produces random integers, and puts them into a list. Have also two threads which uses items up from the list concurrently. These threads need to sum up the items which they grab out of the list. Pause these threads until the list is filled. Then print out the summed results of the two threads.

我认为,这里应该使用wait()notify()。但是,我不确定我是否正确理解它是如何工作的。

该线程从列表中获取项目

@Override
public void run() {
try
{
while (list.size() > 0) {
synchronized (list) {
list.wait();
result += (Integer) list.remove(0);
}
}

} catch (InterruptedException e) {
e.printStackTrace();
}
}

这就是列表中的内容。

@Override
public void run() {
try {
synchronized (list) {
list.wait();
for (int i = 0; i < 10; i++) {
list.add(random.nextInt());
System.out.println("fill");
}
list.notify();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

但是,他们永远不会完成。

最佳答案

您的代码有很多问题:

  • 您声称有两个线程从列表中读取,但您只显示了一个。
  • 您在将列表锁定在第一个代码块中之前正在访问该列表。您需要将synchronized(list) 语句放在while 循环周围。
  • 填充列表的代码会等待,没有任何通知。
  • 如果您的“grab-items-from-the-list”线程首先运行,则列表将为空,因此不会执行任何操作。这可能不是您想要的。

有证据表明这里有足够的困惑,我建议在开始编写代码之前尝试以更抽象的方式思考这一点。

关于java - 并发求和列表,由另一个线程填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22288797/

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