早教吧作业答案频道 -->其他-->
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...的网友还看了以下:
数学题6猜1一台赌博机猜6个数字 其中有 猜单双 大中小 然后是数字 比列是1比2 1比3 1比6 2020-05-13 …
在学生比赛管理信息系统程序调试的过程中,程序员发现学生参加比赛情况查询与实际情况不同。程序员于是首先 2020-05-24 …
猜1~99之间的数字,只许猜5次!每次猜一个数字,会提示大于或是小于这个数字!问怎样猜概率最高?最 2020-06-05 …
请问?一.猜一猜:1绕一圈(猜现代作家名一)2三令五申(猜西游记人物一)3拜年(猜鲁迅短篇小说名一 2020-06-16 …
猜一猜1.仓库上长草()2.上多一竖,少少一点()3.洞猜一猜1.仓库上长草()2.上多一竖,少少 2020-06-19 …
闻所未闻猜一生肖成语“闻所未闻”猜一生肖?(可以猜1到49的数字)再加一句“此物荤身都是宝”(再猜 2020-06-28 …
1.鸡兔同笼,兔的只数比鸡多15只.脚一共有228只.鸡兔各有多少只?2.猜谜:1左边是18,右边 2020-07-24 …
一些中文问题1.猜一猜,打一唐诗例;寿星--白发三千丈(1)药丸--(2)春回大地--(3)张翼德查 2020-11-04 …
概率相等,每次只能猜1种,我每次都猜同一种.猜之前下注,猜对奖励下注的5倍(就是额外得到4倍下注), 2020-12-19 …
谜语猜一猜1.Therearemanybooksinit.It'sverybig谜语猜一猜1.The 2021-01-04 …