zam*_*amN 2 java multithreading arraylist
我在理解如何在java中的线程之间同步ArrayList时遇到了一些困难.目前我的代码如下:
Public class Runner {
public static void main(String argv[]) {
Connect f = new Connect(irc.freenode.net, 6667);
Thread ft = new Thread(f);
ft.start();
Connect q = new Connect(irc.quakenet.org, 6667);
Thread qt = new Thread(q);
qt.start();
MessageParser mp = new MessageParser(f);
MessageParser mp = new MessageParser(q);
f.addMessage("Hello!");
q.addMessage("World!");
}
}
public class Connect {
public List<String> l = new ArrayList<String>();
public static void addMessage(String str) {
l.add(str);
}
}
Run Code Online (Sandbox Code Playgroud)
这个例子只是为了展示我正在做的事情,这并不意味着有意义.无论如何,我想看看是否有可能让我的ArrayList'l'在两个线程之间同步.这样运行f.addMessage("Hello!"); 和q.addMessage("World!");,这两个消息都可以被任何一个类读取.我知道我可以很容易地创建一个单独的类来处理ArrayList并将它传递给两个Connect类但我想看看是否有另一种方法.我知道使用synchronizedList,但我不太确定它是如何工作的,如果它适用于我的情况.
谢谢.
最好用Collections.synchronizedList包装List.
List<String> l = Collections.synchronizedList(new ArrayList<String>());
Run Code Online (Sandbox Code Playgroud)
是的,你可以这样做.本文的目的是确保您在同步访问列表时非常小心.SynchronizedList通常会做的伎俩,但它可能不是你想要的.它只会同步单个方法调用,因此如果您想要自动检查并删除列表的头部,则不合适.在这种情况下,您需要自己管理同步.
例如:
class Worker extends Thread {
private List<String> l;
public Worker(List<String> list) {
this.l = list;
}
public void run() {
try {
while (true) {
synchronized (l) {
if (!l.isEmpty()) {
String s = l.remove(0);
System.out.println(this + " processed " + s);
}
else {
l.wait(1000);
}
}
}
}
catch (InterruptedException e) {
}
}
}
class Main {
public static void main(String[] args) {
List<String> list = new LinkedList<String>();
Worker w1 = new Worker(list);
Worker w2 = new Worker(list);
w1.start();
w2.start();
synchronized (list) {
list.add("Hello");
list.add("World");
}
}
}
Run Code Online (Sandbox Code Playgroud)
希望你明白了.同步需要读取或写入列表的操作,并确保所涉及的所有线程(包括main)都小心访问.
在上面的示例中,"Hello"和"World"字符串以原子方式添加:在两个项目都已添加且主线程退出synchronized块之前,工作者都无法继续.这可能是你想要的也可能不是你想要的:如果你不需要这种控制水平,也许synchronizedList就足够了.
编辑:我猜你的Connect线程正在从列表中提取新项目并将它们发送到IRC频道.这意味着您几乎肯定想要进行自己的同步和等待/通知逻辑,或者您可能想要查看java.util.concurrent包.那里有许多有用的课程可以满足您的需求.synchronizedList只适用于最基本的同步任务,因此在很多时候并不是很有用.
| 归档时间: |
|
| 查看次数: |
15307 次 |
| 最近记录: |