版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
具体要求
用两个线程玩猜数字游戏,第一个线程负责随机给出1-100之间的一个整数,第二个线程负责猜出这个数。
要求每当第二个线程给出自己的猜测之后,第一个线程都会提示“猜小了”、“猜大了”或“猜对了”。
猜数之前,要求第二个线程要等到第一个线程设置好要猜的数 。
第一个线程设置好猜测数之后,两个线程还要互相等待,
其原则是,第二个线程给出自己的猜测后,等待第一个线程给出的提示;第一个线程给出提示后,等待第二个线程给出猜测,如此进行,直到第二个线程给出正确的出猜测后,两个线程进入死亡状态。
同步对象数据类
package com.thread.h5;
public class Num {
//初始数字
private int num;
//猜的数字
private int guessNum;
//游戏状态
private boolean end;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getGuessNum() {
return guessNum;
}
public void setGuessNum(int guessNum) {
this.guessNum = guessNum;
}
public boolean isEnd() {
return end;
}
public void setEnd(boolean end) {
this.end = end;
}
}
NPC判官类
package com.thread.h5;
import java.util.Random;
public class NPC extends Thread{
private Num num;
public NPC(Num num) {
super();
this.num = num;
}
@Override
public void run() {
synchronized (num) {
num.setNum(new Random().nextInt(100));
System.out.println("请开始猜");
num.notify();
try {
num.wait();
while(!num.isEnd()) {
if(num.getGuessNum()>num.getNum()) {
System.out.println("大了,继续");
num.notify();
num.wait();
}else if(num.getGuessNum()<num.getNum()) {
System.out.println("小了,继续");
num.notify();
num.wait();
}else {
System.out.println("对了");
num.setEnd(true);
return;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
猜数类
package com.thread.h5;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Guess extends Thread{
private Num num;
public Guess(Num num) {
super();
this.num = num;
}
@Override
public void run() {
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
synchronized (num) {
try {
while(!num.isEnd()) {
try {
num.setGuessNum(Integer.parseInt(br.readLine()));
}catch(NumberFormatException e) {
System.out.println("请重新输入数字格式的数字");
continue;
}
num.notify();
num.wait(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
测试类
package com.thread.h5;
public class Test {
public static void main(String[] args) {
Num num=new Num();
Guess guess=new Guess(num);
NPC npc=new NPC(num);
npc.start();
guess.start();
}
}
结果实例