我有三个线程ThreadA,ThreadB和ThreadC分别在循环中打印A,B和C值。
我希望输出像A,B,C再一样A,B和C直到循环在threads.中执行。我想使用wait和notify编写这个示例程序。下面的代码是打印所需的输出,但有时我只是在输出中看到“A”,我无法弄清楚案例。
checkLengthSelect
答案 0 :(得分:1)
您致电wait
,但未经过测试是否还有等待的事情。你打电话给notify
,但是你还没有改变通知另一个线程所需的任何东西。您拥有所有这些synchronized
方法,但没有要保护同步的共享状态。
您的代码中没有任何内容有任何意义,似乎您从根本上不了解wait
/ notify
机制的作用。 wait
函数允许线程等待某个共享状态发生更改,notify
函数允许一个线程告诉其他一些共享状态已更改。但必须有一些共享状态,因为wait
/ notify
机制(不像锁或sempahore)是内部无状态的。
您可能应该有一些受同步保护的共享状态。它应该编码下一个应该进行的线程。如果您需要打印,但共享状态表明它不是您的回合,那么您有wait
的内容。当你打印并制作一些其他线程接下来要打印时,那么你有notify
个其他线程的东西。
答案 1 :(得分:0)
考虑通过阻塞队列创建一个彼此连接的线程环。然后你可以在戒指周围传递一个令牌。每个线程等待接收令牌,打印其输出,将令牌传递给环中的下一个线程,然后返回等待。
答案 2 :(得分:0)
printf
答案 3 :(得分:0)
package com.test.algorithms;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
public class PrintInOrder1 {
private static Integer[] a = { 1, 1, 1 };
private static Integer[] b = { 2, 2, 2 };
private static Integer[] c = { 3, 3, 3 };
private static Integer[] d = { 4, 4, 4 };
public static void main(String[] args) throws InterruptedException {
QueueOrder1 q1 = null;
QueueOrder1 q2 = null;
QueueOrder1 q3 = null;
QueueOrder1 q4 = null;
q1 = new QueueOrder1(a);
q2 = new QueueOrder1(b);
q3 = new QueueOrder1(c);
q4 = new QueueOrder1(d);
q1.setChild(q2);
q1.isPrinted = true;
q2.setChild(q3);
q3.setChild(q4);
q4.setChild(q1);
Thread t1 = new Thread(q1);
Thread t2 = new Thread(q2);
Thread t3 = new Thread(q3);
Thread t4 = new Thread(q4);
t1.start();
t2.start();
t3.start();
t4.start();
t1.join();
t2.join();
t3.join();
t4.join();
}
}
class QueueOrder1 implements Runnable {
Integer[] arr;
QueueOrder1 child;
Queue<Integer> queue = new LinkedList<>();
boolean isPrinted = false;
QueueOrder1(Integer[] arr) {
this.arr = arr;
queue.addAll(Arrays.asList(arr));
}
public QueueOrder1 getChild() {
return child;
}
public void setChild(QueueOrder1 child) {
this.child = child;
}
public void run() {
while (!this.queue.isEmpty()) {
synchronized (this) {
if (!this.isPrinted) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.print("**" + this.queue.poll());
this.isPrinted = false;
synchronized (this.child) {
if(!this.child.isPrinted) {
this.child.notify();
}
}
}
}
}