Java_多线程_用两个线程玩猜数字游戏,第一个线程负责随机给出1-100之间的一个整数,第二个线程负责猜出这个数。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Chill_Lyn/article/details/102750955

具体要求

用两个线程玩猜数字游戏,第一个线程负责随机给出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();
		
	}
	
}

结果实例
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Chill_Lyn/article/details/102750955