【发布时间】:2013-03-10 13:39:07
【问题描述】:
我正在尝试创建一个实现,其中多个线程打印序列的替代值。所以这里 thread1 将打印 1,4,7 thread2 将打印 2,5,8 thread3 将打印 3,6,9。我正在使用原子整数和模函数。
在第一个线程打印 1,4,7 而第二个线程打印 2,5,8 和第三个打印 3,6,9 的意义上,下面的实现工作正常,但问题是没有保持序列,即输出可能像 1, 3、2、4、5、7、8、6、9,而我希望保持顺序,因为适当的线程会打印这些值。 一个条件是我不想使用同步。 [仅用于学习目的]
import java.util.concurrent.atomic.AtomicInteger;
public class ThreeThreadsOrderedLockLess {
AtomicInteger sharedOutput = new AtomicInteger(0);
public static void main(String args[]) {
ThreeThreadsOrderedLockLess t = new ThreeThreadsOrderedLockLess();
ThreadTasks t1 = t.new ThreadTasks(0);
ThreadTasks t2 = t.new ThreadTasks(1);
ThreadTasks t3 = t.new ThreadTasks(2);
Thread ts1 = new Thread(t1);
Thread ts2 = new Thread(t2);
Thread ts3 = new Thread(t3);
ts1.start();
ts2.start();
ts3.start();
}
private class ThreadTasks implements Runnable {
private final int threadPosition;
public ThreadTasks(int threadPosition) {
super();
this.threadPosition = threadPosition;
}
@Override
public void run() {
while (sharedOutput.get() < 9) {
if (sharedOutput.get() % 3 == this.threadPosition) {
System.out.println("Printing output for Thread: "
+ this.threadPosition + " "
+ sharedOutput.incrementAndGet());
}
}
}
}
}
【问题讨论】:
-
如果你不使用某种形式的同步,那么当然会发生这种情况!
-
如果你想要串行行为,不要使用线程。
-
@Eyal:正如我提到的,应保持正确的顺序,即输出应为 1、2、3、4、5、6、7、8、9。
标签: java multithreading