优先级不适用于java中的线程

时间:2016-07-25 16:15:51

标签: java multithreading

这是一段代码段。

class Thread1 extends Thread
{
 Thread1(String s)
 {
  super(s);
 }
 public void run()
 {
 for(int i=0;i<5;i++)
 System.out.println(getName());
 }
}

我为三个线程创建了三个不同的类。

class Thread2 extends Thread
{
 Thread2(String s)
 {
 super(s);
 }
 public void run()
  {
 for(int i=0;i<10;i++)
 System.out.println(getName());
 }
}

class Thread3 extends Thread
{
 Thread3(String s)
 {
 super(s);
 }
 public void run()
 {
 for(int i=0;i<12;i++)
 System.out.println(getName());
 }
}

只是尝试按照我设置的优先级打印线程的名称。

class RunThread extends Thread
{
 public static void main(String... s)
 {
 Thread1 t1= new Thread1("T1");
 Thread2 t2= new Thread2("T2");
 Thread3 t3= new Thread3("T3");

但是这些线程以相同的随机方式打印..当没有设置优先级时打印它们。

 t1.setPriority(Thread.NORM_PRIORITY);
 t2.setPriority(Thread.MIN_PRIORITY);
 t3.setPriority(Thread.MAX_PRIORITY);
 }
}

2 个答案:

答案 0 :(得分:1)

线程优先级不符合您的想法

  • 如果您不是管理员或root用户,则提示操作系统不能忽略esp。
  • 只有充分利用CPU才会有所作为。如果所有CPU都忙,它可以使用优先级来决定每个CPU获得多少时间。如果你有空闲的CPU,无论优先级如何,每个线程都可以运行。
  • 启动线程所需的时间不是即时的。一个线程可以花费0.1毫秒到10毫秒来启动,并且在那个时候线程可以打印数千行输出。

注意:Java使用本机线程(几乎在每个现代JVM中),这意味着它不是用于执行调度的操作系统。

答案 1 :(得分:1)

Peter Lawrey说,&#34;它是操作系统的提示 ...&#34;我只是想谈谈什么&#34;提示&#34;装置

大多数台式机/笔记本电脑/服务器/移动设备操作系统不允许用户模式代码直接控制调度程序优先级。这些操作系统都假设多个独立的应用程序彼此竞争以使用可用的CPU,并且它们的调度算法不断调整每个线程的真正优先级,以便为每个线程提供所需的线程, &#34;公平分享&#34;可用的处理能力。

通常有一个参数,用户模式代码可以调整,以缩放线程的共享大小。 (在Unix中,它被称为线程&#34;很好&#34;值。)这通常是Java可以转向的唯一旋钮。

某些操作系统具有实时功能,适用于框上的所有线程彼此协作而不是竞争资源时使用的功能。这些功能通常包括选择不同的调度策略,通常包括至少一个允许用户模式代码直接控制真正的调度优先级。

Java的实时版本可以利用这些功能。

https://en.wikipedia.org/wiki/Real_time_Java