Hello, baby!
**For number 27: Thread-2 in 60 guesses**
Goodbye!!!!
main() is ending...==================================================
public class GuessNumberDemo {
public static void main(String[] args) throws InterruptedException {
Runnable hello = new DisplayMessage("Hello, baby!");
Thread thread1 = new Thread(hello);
thread1.setDaemon(true); <===========
thread1.start();
Runnable bye = new DisplayMessage("Goodbye!!!!");
Thread thread2 = new Thread(bye);
thread2.setPriority(Thread.MIN_PRIORITY+2);
thread2.setDaemon(true); <===========
thread2.start();
Thread thread3 = new GuessANumber(27);
thread3.start();
// thread3.join();
System.out.println("main() is ending...");
}
}===========================================================public class GuessANumber extends Thread {
private int number; public GuessANumber(int number) {
this.number = number;
} public void run() {
int counter = 0;
int guess = 0;
do {
guess = (int) (Math.random() * 100 + 1);
counter++;
} while (guess != number);
System.out.println("**For number " + number+ ": " + this.getName() + " in " + counter
+ " guesses**"); try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
----------------------------------------------------------public class DisplayMessage implements Runnable {
private String message; public DisplayMessage(String message) {
this.message = message;
} public void run() {
while (true) {
System.out.println(message); try {
Thread.sleep(150);
} catch (InterruptedException e) { e.printStackTrace();
}
}
}
}
**For number 27: Thread-2 in 60 guesses**
Goodbye!!!!
main() is ending...==================================================
public class GuessNumberDemo {
public static void main(String[] args) throws InterruptedException {
Runnable hello = new DisplayMessage("Hello, baby!");
Thread thread1 = new Thread(hello);
thread1.setDaemon(true); <===========
thread1.start();
Runnable bye = new DisplayMessage("Goodbye!!!!");
Thread thread2 = new Thread(bye);
thread2.setPriority(Thread.MIN_PRIORITY+2);
thread2.setDaemon(true); <===========
thread2.start();
Thread thread3 = new GuessANumber(27);
thread3.start();
// thread3.join();
System.out.println("main() is ending...");
}
}===========================================================public class GuessANumber extends Thread {
private int number; public GuessANumber(int number) {
this.number = number;
} public void run() {
int counter = 0;
int guess = 0;
do {
guess = (int) (Math.random() * 100 + 1);
counter++;
} while (guess != number);
System.out.println("**For number " + number+ ": " + this.getName() + " in " + counter
+ " guesses**"); try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
----------------------------------------------------------public class DisplayMessage implements Runnable {
private String message; public DisplayMessage(String message) {
this.message = message;
} public void run() {
while (true) {
System.out.println(message); try {
Thread.sleep(150);
} catch (InterruptedException e) { e.printStackTrace();
}
}
}
}
解决方案 »
- 菜鸟求问FtpClient的问题
- java数组的问题(二维)。
- javac能通过,可是java时却出现Exception in thread "main" java.lang.NoSuchMethodError:main这样
- 哪位高手帮忙详细讲一下java中对象内存的处理机制(可以参考下面程序),非常感谢!!
- java 应用程序不能关闭
- Swing画虚线的性能问题
- 如何在Panel放置上百个component?
- 如何在JSP中向数据库中插入图片,和如何在JSP中显示出
- 请教:在TextArea输入框里,如何按CTRL + Enter触发一个按钮的事件?
- applet中使用了jbuilder4的class,怎样才能在ie中显示出来
- 这周在深圳一家公司面试一道上机题没弄出来请教各位大大
- myeclipse has detected that less than 5% of the 12MB of Survivor Space
public static void main(String[] args) throws InterruptedException {
Runnable hello = new DisplayMessage("Hello, baby!");
Thread thread1 = new Thread(hello);
thread1.setDaemon(true); // <===========
thread1.start(); Runnable bye = new DisplayMessage("Goodbye!!!!");
Thread thread2 = new Thread(bye);
//thread2.setPriority(Thread.MIN_PRIORITY + 2);
thread2.setDaemon(true);
thread2.start(); Thread thread3 = new GuessANumber(27);
thread3.start();
thread3.join();
System.out.println("main() is ending...");
}
}class GuessANumber extends Thread {
private int number; public GuessANumber(int number) {
this.number = number;
} public void run() {
int counter = 0;
int guess = 0;
do {
guess = (int) (Math.random() * 100 + 1); counter++;
} while (guess != number);
System.out.println("**For number " + number + ": " + this.getName()
+ " in " + counter + " guesses**"); try {
Thread.sleep(200);
} catch (InterruptedException e) { e.printStackTrace();
}
}
}class DisplayMessage implements Runnable {
private String message; public DisplayMessage(String message) {
this.message = message;
} public void run() {
while (true) {
System.out.println(message); try {
Thread.sleep(250);
} catch (InterruptedException e) { e.printStackTrace();
}
}
}
}
Goodbye!!!!
**For number 27: Thread-2 in 224 guesses**
main() is ending...还是不对呀另外,你们怎么贴上CODE的?
下面代码仅供参考!!!public class GuessNumberDemo {
public static void main(String[] args) throws InterruptedException {
Runnable hello = new DisplayMessage("Hello, baby!");
Thread thread1 = new Thread(hello);
//thread1.setDaemon(true); // <===========
thread1.start(); Runnable bye = new DisplayMessage("Goodbye!!!!");
Thread thread2 = new Thread(bye);
thread2.setPriority(Thread.MIN_PRIORITY + 2);
thread2.setDaemon(true); // <===========
thread2.start(); Thread thread3 = new GuessANumber(27);
thread3.start();
// thread3.join();
while(thread2.isAlive());//等待Thread2结束。
System.out.println("main() is ending...");
}
}
class GuessANumber extends Thread {
private int number; public GuessANumber(int number) {
this.number = number;
} public void run() {
int counter = 0;
int guess = 0;
do {
guess = (int) (Math.random() * 100 + 1); counter++;
} while (guess != number); while(DisplayMessage.outStatus == false)
{
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("**For number " + number + ": " + this.getName()
+ " in " + counter + " guesses**");
DisplayMessage.outStatus = false;//改变状态。
}
}class DisplayMessage implements Runnable {
public static int index = 0;
public static boolean outStatus = false;//线程间传递状态信息。
private String message;
private int number;//标志线程的。 public DisplayMessage(String message) {
this.message = message;
number = index++;
} public void run() {
if(this.number == 0 )
{
System.out.println(message);
DisplayMessage.outStatus = true;
}
else
{
while (DisplayMessage.outStatus == true) {
System.out.println(message);
} try {
Thread.sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(message);
}
}
}
Hello, baby!
**For number 27: Thread-2 in 134 guesses**
Goodbye!!!!
main() is ending...
多谢大神!有几个问题请教:1.为什么一定要thread2.setPriority()? 0~9都行,但不设不行
2.如果thread1.setDaemon(true),程序可以运行。两个Daemon可以吗?
3.如果thread3.join(),程序可以运行。是不是没必要加?WHY?
我写的代码逻辑上有问题,应该不是这个问题。不加这句,让代码的问题很快暴露出来。改过的代码附后。
“2.如果thread1.setDaemon(true),程序可以运行。两个Daemon可以吗?”
设为后台线程就是一旦mian线程执行完,程序就结束。被设成的后台线程如果没执行完,也无条件结束。我改的代码,要让主线程最后结束,所以加与不加都没有关系。
“3.如果thread3.join(),程序可以运行。是不是没必要加?WHY?”
thread3.join()的目的是主的线程要等待thread3线程运行完再运行。代码里如果不加 “while(thread2.isAlive());//等待Thread2结束。”这句,顺序还会乱。因为thread3执行完了,主线程就接着执行了,但这时thread2的输出还没有结束。楼主可以试试。
public class GuessNumberDemo1 {
public static void main(String[] args) throws InterruptedException {
Runnable hello = new DisplayMessage1("Hello, baby!");
Thread thread1 = new Thread(hello);
thread1.setDaemon(true); // <===========
thread1.start(); Runnable bye = new DisplayMessage1("Goodbye!!!!");
Thread thread2 = new Thread(bye); thread2.setPriority(Thread.MIN_PRIORITY + 2);
thread2.setDaemon(true); // <===========
thread2.start(); Thread thread3 = new GuessANumber1(27);
thread3.start();
//thread3.join();
while(thread2.isAlive());//等待Thread2结束。
System.out.println("main() is ending...");
}
}
class GuessANumber1 extends Thread {
public static boolean guessed = false;//猜出,true. 通知线程thread2.
private int number; public GuessANumber1(int number) {
this.number = number;
} public void run() {
int counter = 0;
int guess = 0;
do {
guess = (int) (Math.random() * 100 + 1); counter++;
} while (guess != number); //当DisplayMessage1.outStatus为false时,说明thread1线程还没有输出"hello, baby!"
//程序等待。
while(DisplayMessage1.outStatus == false){
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//当DisplayMessage1.outStatus不为false时,说明thread1线程已经输出了"hello, baby!"
//输出本程序的结果。并把guessed置为true. 让thread2知道猜数结束。
System.out.println("**For number " + number + ": " + this.getName()
+ " in " + counter + " guesses**");
guessed = true;//改变状态。通知thread2.
}
}class DisplayMessage1 implements Runnable {
public static int index = 0;
public static boolean outStatus = false;//线程间传递状态信息。
private String message;
private int number;//标志线程的。 public DisplayMessage1(String message) {
this.message = message;
number = index++;
} public void run() {
if(this.number == 0 ){//thread1 执行这段代码,它一执行完,让thread3输出。
System.out.println(message);
outStatus = true;
}
else//这段代码thread2执行,如果thread3没有执行完,就一直等待。
{
while (GuessANumber1.guessed == false) {
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(message);//输出要输出的内容。"goodbye!".
}
}
}