【发布时间】:2017-03-12 13:33:20
【问题描述】:
所以我有两个线程正在运行,其中一个应该从用户那里获取信息,另一个线程应该使用用户提供的信息,如下所示:
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 这样的东西,但我不希望任何一个线程等待另一个线程,因为除了数据共享之外,他们还有其他任务需要完成。我该怎么做呢?
【问题讨论】:
-
ArrayList 不是线程安全的。
-
什么是线程安全的替代方案,我将如何在线程之间共享它?
-
正如许多人所指出的,队列可能就是您要寻找的。您可以将 ConcurrentLinkedQueue 用于线程安全而无需过度锁定的东西。
标签: java multithreading arraylist concurrency