请问为什么我这个程序(一共两个线程)都已经处于等待状态了,而却没有用notify去唤醒,里面的语句还继续进行,请问这是为什么呀
你不要捕获之后什么都不做,你打印一下。
wait,notify,notifyAll都必须在对象的synchronized同步方法里面调用。如果wait没有在对象的synchronized同步块里面执行会抛出java.lang.IllegalMonitorStateException
package 线程;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.util.Scanner;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class GuessNumber extends JFrame implements ActionListener, Runnable {
JLabel title;
JButton start;
JButton clear;
JTextArea content;
Thread gainNum;
Thread guessNum;
boolean die = false;
boolean flag=true;
GuessNumber() {
}
GuessNumber(String s) {
super(s);
this.setBounds(250, 100, 450, 350);
this.setLayout(new BorderLayout());
this.setDefaultCloseOperation(2);
init();
this.setVisible(true);
}
void init() {
setLayout();
addActionListenner();
setThread();
}
private void setLayout() {
Font font = new Font("微软雅黑", getFont().BOLD, 15);
title = new JLabel("双线程猜数字游戏");
title.setFont(font);
title.setForeground(Color.red);
start = new JButton("开始");
clear = new JButton("清空");
content = new JTextArea();
Box box = Box.createHorizontalBox();
Box box1 = Box.createVerticalBox();
box1.add(new JLabel(" "));
box.add(new JLabel(" "));
box.add(title);
box.add(new JLabel(" "));
box.add(start);
box.add(new JLabel(" "));
box.add(clear);
box1.add(box);
this.add(box1, BorderLayout.NORTH);
this.add(new JScrollPane(content), BorderLayout.CENTER);
}
private void addActionListenner() {
start.addActionListener(this);
clear.addActionListener(this);
}
private void setThread() {
gainNum = new Thread(this);
guessNum = new Thread(this);
gainNum.setName("获得数字");
guessNum.setName("猜数字");
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == start) {
gainNum.start();
} else {
content.setText("");
die=true;
}
}
@Override
public void run() {
int i = 1;
int anwser;
int myAnwser = -1;
Random random = new Random();
if (Thread.currentThread().getName().equals("获得数字")) {
anwser = random.nextInt(101);
content.setText("随机给你一个1到100的数,猜猜是多少");
while (true) {
content.append("\n我第" + i + "次猜的数是:");
try {
if(flag) {
guessNum.start();
flag=false;
}
wait();
} catch (Exception r) {
}
if (myAnwser == anwser) {
content.append("\n恭喜你,猜对了!");
die = true;
} else if (myAnwser < anwser) {
content.append("\n你猜小了");
} else {
content.append("\n你猜大了");
}
if (die == true)
return;
i++;
}
} else {
try {
while (true) {
if (die == true)
return;
String now=content.getText();
while(true) {
if(!content.getText().equals(now)) break;
}
String num[] = content.getText().split(":");
myAnwser = Integer.parseInt(num[num.length - 1]);
content.append(String.valueOf(myAnwser));
wait();
}
} catch (Exception e) {
}
}
notifyAll();
}
public static void main(String[] args) {
new GuessNumber("双线程猜数字");
}
}