java多线程猜数字问题package test;/*** 用两个线程来玩猜数字游戏,第一个线程负责随机给出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,猜猜是多少”置于第一行呢?每次运行都是在于第二行,很少能够运行在第一行.求大神指教,
答的好加分.
应该为线程同步的问题,求会的给解!
乡村占卜者 1年前 已收到1个回答 举报

ulysses39654 幼苗

共回答了21个问题采纳率:100% 举报

通过改你的代码,我解决了线程同步的问题.//后是注释
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下通过.
望采纳,欢迎追问
如果希望我把完整代码重新贴出,请追问(不要评论),这样方便新开个窗口而不影响本窗口.

1年前 追问

4

乡村占卜者 举报

你这个是通过 synchronized 与notify()和wait()结合起来用的啊,真的不错,刚学的还不怎么会用。另外那个退出程序可以在第二个return;前加上System.exit(0);语句,就可以自动退出了

举报 ulysses39654

是的,在第二个return;前加上System.exit(0);语句,就可以自动退出了。但是加上System.exit(0);语句,第二个return;就没用了。说的简单点,第二个return;就成了“不可达语句”。因为执行了System.exit(0);该程序就退出了,不会执行return. //以下是部分完整代码: import java.lang.Runnable; //之后未改的一部分略去了“输入内容已经达到长度限制,请删减” 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 synchronized 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("恭喜,你猜对了"); } } try { notify(); wait();//Thread.sleep(1500); } catch (Exception e) { } } else 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("我成功了"); System.exit(0);//return; } } try { notify(); wait();//Thread.sleep(); } catch (Exception e) { } } } } }
可能相似的问题
Copyright © 2024 YULUCN.COM - 雨露学习互助 - 18 q. 2.060 s. - webmaster@yulucn.com