为什么我的帖子没有收到通知?

时间:2013-07-30 14:07:20

标签: java multithreading scjp

在练习中

  

制作一个有时装和缝纫机的程序,操作员输入数据   宽度和高度,通知缝纫机,以便完成工作。

Operator接收数据并处理并通知机器。 Machine接收数据并完成整个过程。

但是,当我运行时,Maquina线程没有得到通知,机器和Operator处于无限循环接收数据。

public class Operator extends Thread {

    Scanner in = new Scanner(System.in);
    int altura, largura;
    public void run() {
        while(true) {
            synchronized (this) {
                System.out.print("Altura: ");
                altura = in.nextInt();
                System.out.print("Largura: ");
                largura = in.nextInt();
                notify();
            }
        }
    }

    public String getForma() {
        return "Forro de mesa : " + (altura * largura);
    }
}

public class Maquina extends Thread{

    private Operator c;

    public Maquina(Operator c) {
        this.c = c;
    }


    public void run() {
        while(true) {
            synchronized (c) {
                try {

                    System.out.println("Waiting shape...");
                    c.wait();

                    System.out.println("init drawn...");
                    Thread.currentThread().sleep(3000);

                    System.out.println("drawing...");
                    Thread.currentThread().sleep(3000);

                    System.out.println(c.getForma() + ", finalized");

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

在运行代码时,问题似乎是永远不会到达"Waiting shape..."消息。这让我感到惊讶,但似乎while (true) { synchronized(c)永远不会让Maquina进入synchronized区块。

Operator.run()方法的前面添加一个小睡眠可以解决问题。它为Maquina获取锁定并输入wait()

提供了时间
while (true) {
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        return;
    }
    synchronized (this) {
        System.out.print("Altura: ");
        altura = in.nextInt();
        System.out.print("Largura: ");
        largura = in.nextInt();
        notify();
    }
}