我想像这样在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

10-07 19:01
查看更多