指定されたコードスニペットは、wait()メソッドとnotify()メソッドを使用して3つのスレッドを同期させて順番に番号を出力します。リエントラントロックを使用して3つのスレッドを同期する
class JoinTask {
private int currentRank = 1;
public void doJob(int rank, int printNo) {
synchronized (this) {
while (rank != currentRank) {
try {
System.out.println("going to wait by thread:" + printNo);
wait();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
System.out.println("Job:" + printNo + " : " + currentRank);
currentRank++;
notifyAll();
}
}
}
public class ThreeThreadsPlay {
public static void main(String[] args) {
final JoinTask task = new JoinTask();
Thread A = new Thread() {
public void run() {
int k = 1;
for (int i = 1; i < 30; i++) {
task.doJob(k, 1);
k = k + 3;
}}};
Thread B = new Thread() {
public void run() {
int k = 2;
for (int i = 1; i < 30; i++) {
task.doJob(k, 2);
k = k + 3;
}}};
Thread C = new Thread() {
public void run() {
int k = 3;
for (int i = 1; i < 30; i++) {
task.doJob(k, 3);
k = k + 3;
}}};
C.start();
B.start();
A.start();
}}
結果:
going to wait by thread:3
Job:1 : 1
going to wait by thread:1
Job:2 : 2
going to wait by thread:2
going to wait by thread:1
Job:3 : 3
going to wait by thread:3
Job:1 : 4
going to wait by thread:1
Job:2 : 5
going to wait by thread:2
going to wait by thread:1
Job:3 : 6
going to wait by thread:3
Job:1 : 7
going to wait by thread:1
Job:2 : 8
going to wait by thread:2
going to wait by thread:1
Job:3 : 9 ...and so on
どのように私はそれを用いリエントラントロックを達成できますか?
このようなメカニズムを提供するためにリエントラントロックを使用する他の例も役立ちます。
努力してください。 'ReentrantLock'と' Condition'は 'synchronized'と' wait/notify'を使うこととあまり変わりません。 – Kayaman
私はそれを試しました..しかしそれは失敗していました。したがって、私はいくつかの入力について投稿しました。単に声明を出すのではなく、本当に感謝しています。 – GaurZilla
単語は「再入可能」ではなく「再入可能」であり、これらのロックはすでに再入可能です。あなたが何を求めているのか不明です。 – EJP