複数のスレッドがシーケンスの代替値を出力する実装を作成しようとしています。したがって、ここでは、thread1は1,4,7を印刷し、thread2は2,5,8を印刷し、thread3は3,6,9を印刷します。アトミック整数とモジュロ関数を使用しています。
以下の実装は、最初のスレッドが1,4,7を出力し、2番目のスレッドが2,5,8を出力し、3番目のスレッドが3,6,9を出力するという意味で正常に機能しますが、問題はシーケンスが維持されないことです。つまり、出力は1,3,2のようになります。 、4,5,7,8,6,9ですが、適切なスレッドがそれらの値を出力するときにシーケンスを維持したいのです。1つの条件は、同期を使用したくないということです。[学習目的のためだけに]
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());
}
}
}
}
}