当使用两个线程时,如何确保打印输出顺序与原始数组中的顺序相同?我想打印'0 1 2 3 4 5 6 7 8 9',但目前订单无法保证。有什么方法可以按顺序排列吗?非常感谢。
public class Test {
public static void main(String[] args){
DataStore dataStore = new DataStore();
for(int i=0; i<10; i++){
dataStore.add(String.valueOf(i));
}
CopyThread t1 = new CopyThread(dataStore);
CopyThread t2 = new CopyThread(dataStore);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch(Throwable t) {
}
}
}
class CopyThread extends Thread {
private DataStore data;
public CopyThread(DataStore data){
this.data = data;
}
public void run(){
DataStore.Line line = null;
int lineID;
while( (line = data.getLine()) != null ){
lineID = line.id;
System.out.println(Thread.currentThread().getName() + ": " + lineID);
}
}
}
class DataStore {
ArrayList<String> lines = new ArrayList<String>();
int current = 0;
public synchronized Line getLine () {
if (current >= lines.size()) {
return null;
}
Line line = new Line(lines.get(current), current);
current++;
return line;
}
public synchronized void add (String s) {
lines.add(s);
}
public synchronized int size () {
return lines.size();
}
public static class Line {
public String line;
public int id;
public Line (String str, int i) {
line = str;
id = i;
}
}
}
答案 0 :(得分:1)
尝试使用Vector而不是ArrayList。
Vector类实现了一个可增长的对象数组。像一个 array,它包含可以使用整数访问的组件 指数。但是,Vector的大小可以根据需要增大或缩小 适应Vector之后添加和删除项目 创建
每个向量都试图通过维护a来优化存储管理 能力和能力增量。容量总是至少为 矢量大小;它通常更大,因为作为组件 被添加到向量中,向量的存储以块的形式增加 容量大小增量。应用程序可以增加容量 插入大量组件之前的向量;这减少了 增量重新分配的数量。
Vector的迭代器和listIterator方法返回的迭代器 快速失败:如果Vector在任何时候都是结构修改的 在迭代器创建之后,除了通过之外的任何方式 Iterator自己删除或添加方法,Iterator会抛出一个 ConcurrentModificationException的。因此,面对并发 修改后,迭代器快速而干净地失败,而不是 在不确定的时间冒着任意的,非确定性的行为 在将来。 Vector的元素方法返回的枚举 不是快速失败。
请注意,无法保证迭代器的快速失败行为 一般来说,不可能做出任何硬性保证 存在不同步的并发修改。快速失败 迭代器抛出ConcurrentModificationException就是尽力而为 基础。因此,编写一个依赖的程序是错误的 关于它的正确性的这个例外:快速失败的行为 迭代器应该只用于检测错误。
答案 1 :(得分:0)
您可以使用synchronize来实现:
synchronized(data) {
while( (line = data.getLine()) != null ){
lineID = line.id;
System.out.println(Thread.currentThread().getName() + ": " + lineID);
}
}