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”,但您可能看不到对线程进行优先级排序的任何效果(如果有的话:我最近尝试让具有不同优先级的线程增加不同的计数器;不管我做了什么,它们总是以相同的速度增加计数器)。