在练习中
制作一个有时装和缝纫机的程序,操作员输入数据 宽度和高度,通知缝纫机,以便完成工作。
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();
}
}
}
}
}
答案 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();
}
}