早教吧 育儿知识 作业答案 考试题库 百科 知识分享

java多线程猜数字问题packagetest;/***用两个线程来玩猜数字游戏,第一个线程负责随机给出1-100之间的整数,第二个线程负责猜出这个数,每当第二个程序给出自己的猜测后,*第一个线程都会提示"

题目详情
java多线程猜数字问题
package test;
/**
* 用两个线程来玩猜数字游戏,第一个线程负责随机给出1-100之间的整数,第二个线程负责猜出这个数,每当第二个程序给出自己的猜测后,
* 第一个线程都会提示"猜小了"、猜大了、猜对了
*/
import java.lang.Runnable;
import java.lang.Thread;
public class Runnable4 {
public static void main(String args[]) {
Number number = new Number();
number.giveNumberThread.start();
number.guessNumberThread.start();
}
}
class Number implements Runnable {
int realNumber,guessNumber,min = 0,max = 100,message;
final int SMALLER = -1,LARGER = 1,SUCCESS = 8;
Thread giveNumberThread,guessNumberThread;
Number() {
giveNumberThread = new Thread(this);
guessNumberThread = new Thread(this);
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int count = 1; true; count++) {
if (Thread.currentThread() == giveNumberThread) {
if (count == 1) {
realNumber = (int) (Math.random() * 100) + 1;
System.out.println("随机给你一个数为"+realNumber+",猜猜是多少");
} else {
if (realNumber > guessNumber) {
message = SMALLER;
System.out.println("你猜小了");
} else if (realNumber < guessNumber) {
message = LARGER;
System.out.println("你猜大了");
} else {
message = SUCCESS;
System.out.println("恭喜,你猜对了");
return;
}
}
try {
Thread.sleep(1500);
} catch (Exception e) {
}
}
if (Thread.currentThread() == guessNumberThread) {
if (count == 1) {
guessNumber = (min + max) / 2;
System.out.println("我第" + count + "次猜这个数:" + guessNumber);
} else {
if (message == SMALLER) {
min = guessNumber;
guessNumber = (min + max) / 2;
System.out.println("我第" + count + "次猜这个数是"
+ guessNumber);
} else if (message == LARGER) {
max = guessNumber;
guessNumber = (min + max) / 2;
System.out.println("我第" + count + "次猜这个数是"
+ guessNumber);
} else if (message == SUCCESS) {
System.out.println("我成功了");
return;
}
}
try {
Thread.sleep(1500);
} catch (Exception e) {
}
}
}
}
}
我第1次猜这个数:50
随机给你一个数为83,猜猜是多少
你猜小了
你猜小了
我第3次猜这个数是75
你猜小了
我第4次猜这个数是87
你猜大了
我第5次猜这个数是93
你猜大了
我第6次猜这个数是90
你猜大了
我第7次猜这个数是88
你猜大了
我第8次猜这个数是87
你猜大了
我第9次猜这个数是87
你猜大了
我第10次猜这个数是87
你猜大了
我第11次猜这个数是87
你猜大了
我第12次猜这个数是87
你猜大了
我第13次猜这个数是87
运行结果这样子,然后进行死循环输出87,没办法在猜对了,而且要怎么改才能把“随机给你一个数为83,猜猜是多少”置于第一行呢?每次运行都是在于第二行,很少能够运行在第一行.求大神指教,
答的好加分.
应该为线程同步的问题,求会的给解!
▼优质解答
答案和解析
通过改你的代码,我解决了线程同步的问题.//后是注释
public synchronized void run() { //加上了临界锁关键字synchronized
//以下是你源代码,上下两个这里均要改.
try {
Thread.sleep(1500); //我将改这一行,你要将Thread.sleep(1500);删掉
} catch (Exception e) {
}
//以下是我的代码
try {
notify(); //唤醒之前让出资源的线程,如果不唤醒,就变成相互等待对方了
wait(); //由于加上了synchronized临界锁,如果当前线程不让出资源,另一线程将无法运行.
} catch (Exception e) {
}
//以下是比我第一次回答多出来的部分
在giveNumberThread下最后
message = SUCCESS;
System.out.println("恭喜,你猜对了");
return;
以上的return要去除.
在guessNumberThread下
else if (message == SUCCESS) {
System.out.println("我成功了");
return;
把return去除,改成System.exit(0);这样就能自动退出程序了.
以上新增部分把自动退出程序问题也解决了
以上更改,eclipse+JDK1.7u9+JRE7下通过.
望采纳,欢迎追问
如果希望我把完整代码重新贴出,请追问(不要评论),这样方便新开个窗口而不影响本窗口.