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();
}
}
}
}

解决方案 »

  1.   

    thread1.setDaemon(true); 是必须的吗?
      

  2.   

    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...");
    }
    }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();
    }
    }
    }
    }
      

  3.   

    结果:Hello, baby!
    Goodbye!!!!
    **For number 27: Thread-2 in 224 guesses**
    main() is ending...还是不对呀另外,你们怎么贴上CODE的?
      

  4.   

    需要加一些条件。
    下面代码仅供参考!!!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...
      

  5.   


     多谢大神!有几个问题请教:1.为什么一定要thread2.setPriority()? 0~9都行,但不设不行
    2.如果thread1.setDaemon(true),程序可以运行。两个Daemon可以吗?
    3.如果thread3.join(),程序可以运行。是不是没必要加?WHY?
     
      

  6.   

    "1.为什么一定要thread2.setPriority()? 0~9都行,但不设不行"
    我写的代码逻辑上有问题,应该不是这个问题。不加这句,让代码的问题很快暴露出来。改过的代码附后。
    “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!".
    }
    }
    }