Java 为什么两个优先级最低和最高的线程仍然交错?

Java 为什么两个优先级最低和最高的线程仍然交错?,java,multithreading,Java,Multithreading,考虑参加以下课程: public class RunnableDemo implements Runnable { private Thread t; private String threadName; RunnableDemo( String name) { threadName = name; System.out.println("Creating thread " + threadName );

考虑参加以下课程:

public class RunnableDemo implements Runnable {
       private Thread t;
       private String threadName;

       RunnableDemo( String name) {
          threadName = name;
          System.out.println("Creating thread " +  threadName );
       }

       @Override
       public void run() {
          System.out.println("Running thread" +  threadName );
          try {
             for(int i = 4; i > 0; i--) {
                System.out.println("Thread " + threadName + ", iteration: " + i);
                // Let the thread sleep for a while.
                Thread.sleep(50);
             }
          } catch (InterruptedException e) {
             System.out.println("Thread " + threadName + " interrupted.");
          }
          System.out.println(threadName + " exiting.");
       }

       public void Fire (int priority) {
          System.out.println("Starting thread " +  threadName );
          if (t == null) {
             t = new Thread (this, threadName);
             t.setPriority(priority);
             t.start ();
          }
       }
}
和另一个类来测试它:

public class TestThread {

    public TestThread() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
          RunnableDemo R1 = new RunnableDemo( "RunnableDemo-One");      
          RunnableDemo R2 = new RunnableDemo( "RunnableDemo-Two");

          R1.Fire(Thread.MAX_PRIORITY);
          R2.Fire(Thread.MIN_PRIORITY);
    }

}
运行时此代码段的输出为:

Creating thread RunnableDemo-One
Creating thread RunnableDemo-Two
Starting thread RunnableDemo-One
Starting thread RunnableDemo-Two
Running threadRunnableDemo-One
Thread RunnableDemo-One, iteration: 4
Running threadRunnableDemo-Two
Thread RunnableDemo-Two, iteration: 4
Thread RunnableDemo-Two, iteration: 3
Thread RunnableDemo-One, iteration: 3
Thread RunnableDemo-Two, iteration: 2
Thread RunnableDemo-One, iteration: 2
Thread RunnableDemo-Two, iteration: 1
Thread RunnableDemo-One, iteration: 1
RunnableDemo-Two exiting.
RunnableDemo-One exiting.
换句话说,尽管一个线程具有MAX_优先级,另一个线程具有MIN_优先级,系统仍然在它们之间交错,就好像它们具有相同的优先级一样为什么

用不同的措辞来表达相同的问题:是否存在一个场景或代码修改,其中程序的输出将是:

Thread RunnableDemo-One, iteration: 4
Thread RunnableDemo-One, iteration: 3
Thread RunnableDemo-One, iteration: 2
Thread RunnableDemo-One, iteration: 1

Thread RunnableDemo-Two, iteration: 4
Thread RunnableDemo-Two, iteration: 3
Thread RunnableDemo-Two, iteration: 2
Thread RunnableDemo-Two, iteration: 1

也就是说,在保持它们作为独立线程的同时?

JVM将线程呈现给操作系统,在这里,优先级再次根据JVM调度算法发挥作用,但最终由操作系统决定,因此,它自己的算法将尝试尽可能多地使用CPU核心周期中的多个线程争夺资源。

但是,如果有一个用例,你希望有一个线程完成前秒,你可以考虑使用Couter()。.

JVM将线程呈现给操作系统,在这里,优先级再次根据JVM调度算法发挥作用,但最终由操作系统决定,因此,它自己的算法将尽可能多地使用争夺资源的多个线程中的CPU核心周期。

但是,如果有一个用例希望在第二个线程之前完成一个线程,那么可以考虑使用Co()。< /P>为什么线程2在线程线程睡眠时不做任何工作而徘徊?如果高优先级线程决定多睡几天,您会认为它永远不会完成任何工作吗?优先级是关于分配CPU时间。。。当一个线程处于睡眠状态时,它不会占用CPU时间。您的CPU可以并行运行两个线程吗?在提出这样的问题之前,您需要复习一下您的多编程基础知识。为什么线程一处于睡眠状态时,线程二会无所事事?如果高优先级线程决定多睡几天,您会认为它永远不会完成任何工作吗?优先级是关于分配CPU时间。。。当一个线程处于睡眠状态时,它不会占用CPU时间。您的CPU可以并行运行两个线程吗?在问这样的问题之前,您需要复习一下多重编程的基础知识。谢谢。事实上,当我完全删除sleep()时,我证明了系统正在向更高优先级的线程靠拢,尽管不是完全靠拢。除了答案给出的论点之外:请记住,只有当系统处于高负载时,这些优先级才可能生效。虽然每个人都有“足够的CPU”,但您可能看不到对线程进行优先级排序的任何效果(如果有的话:我最近尝试让具有不同优先级的线程增加不同的计数器;无论我做了什么,它们总是以相同的速度增加计数器)。谢谢。事实上,当我完全删除sleep()时,我证明了系统正在向更高优先级的线程靠拢,尽管不是完全靠拢。除了答案给出的论点之外:请记住,只有当系统处于高负载时,这些优先级才可能生效。虽然每个人都有“足够的CPU”,但您可能看不到对线程进行优先级排序的任何效果(如果有的话:我最近尝试让具有不同优先级的线程增加不同的计数器;不管我做了什么,它们总是以相同的速度增加计数器)。