我想像这样在2个线程之间建立通信:
第一个线程(Sender
)向第二个线程(Receiver
)发送一个整数,而Receiver
显示此整数的平方。
这是我的代码:
Carre.java(main):
public class Carre {
static Boolean msgArrived = Boolean.FALSE ;
static int n ;
public static void main(String[] args) {
Thread sender = new Thread(new Sender()) ;
Thread receiver = new Thread(new Receiver()) ;
sender.start() ;
receiver.start() ;
}
public int getN() {
return n;
}
}
Sender.java:
import java.util.Random;
public class Sender implements Runnable {
@Override
public void run() {
while(Carre.msgArrived == Boolean.TRUE) {
try {
wait() ;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i = 0; i < 10; i ++) {
Random ran = new Random() ;
Carre.n = ran.nextInt(100) ;
Carre.msgArrived = Boolean.TRUE ;
notifyAll() ;
}
}
}
接收器
公共类Receiver实现Runnable {
@Override
public void run() {
while(Carre.msgArrived == Boolean.FALSE) {
try {
wait() ;
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Carre.n * Carre.n) ;
Carre.msgArrived = Boolean.TRUE ;
notifyAll() ;
}
}
&当我尝试执行代码时,收到以下错误消息:
线程“ Thread-1”中的异常java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at Receiver.run(Receiver.java:12)
at java.lang.Thread.run(Thread.java:636)
线程“ Thread-0”中的异常java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at Sender.run(Sender.java:19)
at java.lang.Thread.run(Thread.java:636)
最佳答案
在我看来,最好不要直接使用线程,因为它们是太低级别的并发实体,因此很难使用。
您应该能够通过java.util.concurrent软件包工具更轻松地制定生产者/消费者方案。
您可以在这里查看:Producer/Consumer threads using a Queue