我想創建一個實現,其中多個線程打印序列的備用值。所以這裏thread1會打印1,4,7 thread2會打印2,5,8 thread3會打印3,6,9。我正在使用原子整數和模函數。3個線程按順序打印備用值
下面的實現工作正常,第一個線程打印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());
}
}
}
}
}
如果不使用某種形式的同步,然後是cou rse這會發生! – 2013-03-10 13:39:57
如果您希望序列行爲不使用線程。 – inf 2013-03-10 13:42:58
@Eyal:正如我所說的那樣,保持正確的順序,即輸出shld是1,2,3,4,5,6,7,8,9。 – Lokesh 2013-03-10 13:47:47