非守护线程启动时,守护线程被抢占了吗?

时间:2018-10-13 21:16:54

标签: java

我正在阅读本教程,在其结尾处有一个预期结果的代码。

这是代码:

public class DisplayMessage implements Runnable {
   private String message;

   public DisplayMessage(String message) {
      this.message = message;
   }

   public void run() {
      while(true) {
         System.out.println(message);
      }
   }
}

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);
         System.out.println(this.getName() + " guesses " + guess);
         counter++;
      } while(guess != number);
      System.out.println("** Correct!" + this.getName() + "in" + counter + "guesses.**");
   }
}

public class ThreadClassDemo {

   public static void main(String [] args) {
      Runnable hello = new DisplayMessage("Hello");
      Thread thread1 = new Thread(hello);
      thread1.setDaemon(true);
      thread1.setName("hello");
      System.out.println("Starting hello thread...");
      thread1.start();

      Runnable bye = new DisplayMessage("Goodbye");
      Thread thread2 = new Thread(bye);
      thread2.setPriority(Thread.MIN_PRIORITY);
      thread2.setDaemon(true);
      System.out.println("Starting goodbye thread...");
      thread2.start();

      System.out.println("Starting thread3...");
      Thread thread3 = new GuessANumber(27);
      thread3.start();
      try {
         thread3.join();
      } catch (InterruptedException e) {
         System.out.println("Thread interrupted.");
      }
      System.out.println("Starting thread4...");
      Thread thread4 = new GuessANumber(75);

      thread4.start();
      System.out.println("main() is ending...");
   }
}

预期结果是:

Starting hello thread...
Starting goodbye thread...
Hello
Hello
Hello
Hello
Hello
Hello
Goodbye
Goodbye
Goodbye
Goodbye
Goodbye
.......

我在编译器上运行它,结果却不同。我在开始时遇到了一堆Hello,然后是再见,然后又出现了一些Hello,也来自其他线程。 (我也没想到)

我期望: 你好 你好 ....(更多您好) **正确!.....

然后退出程序(由于延迟等,我可以想像在末尾会看到更多的Hello消息)

我的问题是:

当另一个具有较高优先级的守护程序线程正在运行时,是否不应该运行具有较低优先级的守护程序线程?如果是,为什么我们看不到“再见”

我们应该期望从运行thread4看到任何结果吗?

0 个答案:

没有答案