早教吧作业答案频道 -->其他-->
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,猜猜是多少”置于第一行呢?每次运行都是在于第二行,很少能够运行在第一行.求大神指教,
答的好加分.
应该为线程同步的问题,求会的给解!
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下通过.
望采纳,欢迎追问
如果希望我把完整代码重新贴出,请追问(不要评论),这样方便新开个窗口而不影响本窗口.
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下通过.
望采纳,欢迎追问
如果希望我把完整代码重新贴出,请追问(不要评论),这样方便新开个窗口而不影响本窗口.
看了 java多线程猜数字问题pa...的网友还看了以下:
均变速直线运动两物体用同一初速度v0=24.5m.s^-1从同一点铅直地向上抛出,抛出时刻相隔T= 2020-04-27 …
1.甲乙两车从A/B两地同时出发,相向而行,如果甲车提前一段时间出发,那么两车将提前30分相遇.已 2020-05-13 …
海运中经常会说多少T(不是吨,而是英文字母T)这个多少T是指什么?还有也会说这个船有多少T(英文字 2020-05-16 …
—mum,will you take me to the park tomorrow?—If it 2020-05-17 …
定积分Asin^2(t/T)dt是多少原题是从0-T,定积分Asin^2(t/T)dt=1求A的值 2020-06-10 …
英语中entity怎么读啊不好意思,不能语音,只能用汉字表达了..该怎么读呢?到底读按t一提?还是 2020-06-11 …
某商场在一次促销活动中,第一天卖出T恤衫54件,第二天卖出总量的14,这时已卖出的T恤与剩下的件数 2020-06-27 …
求一个积分dx/(x+t)=dy/(-y+t)写出全过程,通俗易懂.我用代换法u=-y+t出现d( 2020-07-11 …
某商场在一次促销活动中,第一天卖出T恤衫54件,第二天卖出总量的14,这时已卖出的T恤与剩下的件数 2020-08-01 …
英语翻译你必须先付30%的定金.我们的付款方式为T/T.在我们寄出提单前你必须付其余的费用. 2020-11-28 …