gpt4 book ai didi

java - 在两个线程之间共享一个 ArrayList?

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:10 25 4
gpt4 key购买 nike

所以我有两个线程在运行,其中一个线程应该从用户那里获取信息,另一个线程应该处理用户提供的信息,如下所示:

public class UserRequest implements Runnable {

@Override
public void run() {
// TODO Auto-generated method stub
String request;
Scanner input = new Scanner(System.in);
while(true)
{
System.out.println("Please enter request:");
request = input.nextLine();
try
{
//do something
}
catch(IOException e)
{
e.printStackTrace();
}
}

}

第二个线程:

public class Poller implements Runnable {

ArrayList<String> colors = new ArrayList<String>();

public void poll()
{
for(String color : colors)
{
if(color == "")
{
//do work
}
else
{
//do work
}
}
}

@Override
public void run() {

colors.add("Violet");
colors.add("Green");
colors.add("Yellow");
colors.add("Orange");

while(true)
poll();
}
}

我想做的是获取用户在 UserRequest 对象中输入的任何输入,并将其插入 Poller 对象中的 ArrayList,这样它也可以对新值“起作用”。我看过一些类似 BlockingQueue 的东西,但我不希望任何一个 Thread 等待另一个,因为除了这种数据共享之外,它们还有其他需要完成的任务。我该怎么做呢?

最佳答案

由于您使用了动词“push”和“poll”,您似乎在寻找Queue 而不是List

因此,我认为您正在寻找记录在案的 ConcurrentLinkedQueue here .

它允许您让 UserRequest 对象为它提供数据,并让您的 Poller 对象使用它。

虽然看起来你的 Poller 对象会有相当高的 CPU 消耗,因为打开 while 没有任何 wait:

public class Poller implements Runnable {
Queue<String> colors = new ConcurrentLinkedQueue<String>();

public void poll() {
while(this.colors.isEmpty()){
Thread.currentThread().wait();
}

String color = this.colors.poll();

while(color != null) {
if(color == "") {
//do work

} else {
//do work
}

color = this.colors.poll();
}
}

@Override
public void run() {
colors.offer("Violet");
colors.offer("Green");
colors.offer("Yellow");
colors.offer("Orange");

while(true) {

this.poll();
}
}
}

此代码需要一些更改才能运行,但它几乎包含您需要的所有内容。它的作用非常简单:它会不断轮询,直到没有元素为止。一旦发生这种情况,Poller 对象会要求它的当前 Thread hibernate ,因为如果没有 Queue 中的元素,它就无法运行。

public class UserRequest implements Runnable {

@Override
public void run() {
String request;
Scanner input = new Scanner(System.in);

while(true) {
System.out.println("Please enter request:");
request = input.nextLine();

try {
//do something

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

} finally {
this.notifyAll(); // Notifies all sleeping threads to wake up
}
}
}

如果您注意到了,我只向您的 UserRequest 类添加了一个 notifyAll 调用。为什么?非常简单:notifyAll 唤醒所有 waiting Thread,这正是所有没有元素的 Poller 正在做的事情。

调用后,Poller 将被唤醒,检查它们的颜色 Queue 是否有元素并使用它们。如果 Queue 没有元素,它们将再次 hibernate ,直到 UserRequest 再次唤醒它们,依此类推。

关于java - 在两个线程之间共享一个 ArrayList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40325724/

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