2017-06-18 45 views
1

我在网上读到螺纹setpriority()可和整个下面传来:的Java多线程:setpriority()可

final void setPriority(int level) 

这里,级别指定调用新的优先级设置线。

来源:http://www.java-samples.com/showtutorial.php?tutorialid=302

什么我不明白是怎么setpriority()可改变调用线程的优先级:它不应该影响到调用它的对象,被呼叫者?所以如果我从主要(),然后主要()的优先级将被改变?

这是除非我不明白调用线程 ..是什么意思..。

回答

2

的methid setPriorityThread.javahttps://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#setPriority(int)

优先级定义是有用的提示线程调度来决定优先哪个线程同时分配CPU。默认情况下,主线程启动一个java程序的执行。开发人员可以创建自定义的Thread.java对象。当这些线程启动时,由线程的run方法启动的代码将在其执行该特定线程的路径中执行。每个线程都由一个方法调用堆栈支持。主线程的默认优先级为5.创建的任何线程都提供优先级值,与创建其执行路径的线程的优先级值相同。

您需要一个可以在其上调用(调用)方法的对象。

当你说“...如果我从main(),...”调用方法时,你是什么意思?你只是无法调用它没有任何线程的实例。您可以创建一个线程实例,然后调用其上的方法setPriority。这样做会设置调用该方法的线程的优先级。

Thread usedDefinedThreadReference = new Thread(); 
usedDefinedThreadReference.setPriority(2); 

上面会创建线程的实例,并设置其优先级等于当前执行的线程,如果它的主线程则默认情况下它的优先级设置为5

Thread.currentThread().setPriority(6); 

上面将设置当前正在执行的线程的优先级为6

public static void main(String[] args){ 
    Thread.currentThread().setPriority(7); // currently executing thread is Main thread and its priority is set as 7 from its default value of 5 
    Thread t = new MyThread(); // its priority is set to 7 as current executing thread has priority equal to 7. 

    t.setPriority(3); // priority of Thread object referenced by t is set to 3. 

    Thread.currentThread().setPriority(8); // main thread is currently executing thread hence its priority is set as 8. 

} 

public class MyThread extends Thread { 

    public Thread(){ 
      Thread.currentathread().setPriority(9); // Main thread is currently executing thread hence its priority is set as 9. 
      this.setPriority(8); // this refers to object of MyThread , the current object hence its priority is set as 8 not of main. 
    } 
    public void run(){ 
     Thread.currentThread().setPriority(2); // currently executing thread is MyThread`s object hence its priority is set as 2. 
     this.setPriority(4); // again currently executing thread is Object of MyThread hence its priority is set as 4. 
    } 
} 
+0

我的意思是,如果在main()中实例化一个Thread对象,然后在该对象上调用setPriority(),哪个优先级会改变,我创建的线程还是main()的? – Searcherer

+1

优先级是在线程对象上调用'setPriority'时设置的整数值。它是一个实例方法,所以它影响它所调用的对象。我已经为你编辑了我的答案。 –

+0

Thx。所以,正如我上面评论的那样,我在网页上看到的内容似乎是错误的......。 – Searcherer

1

Java中的每段代码都是从Thread的一个实例中执行的。

如果您不写自己的线程,则所有内容都将由java-main-thread执行。

当Java虚拟机启动时,通常会有一个非守护线程(通常会调用某个指定类的main方法)。 (从Thread了Java API)

但是您可以使用多个Thread正穿过你的项目,使多线程和并行技术的使用你的机器上。

方法setPriority可以用来给你调用这个方法的当前线程对象一个优先级。线程调度程序使用您的操作系统的优先级来根据它们的优先级为线程提供CPU时间。因此,具有更高优先级的线程比具有更小优先级的线程更可能获得CPU时间。

同样,如果你不使用任何自制线程,你确实使用java-main-thread。您始终可以通过使用Thread.getCurrentThread()访问当前的线程。

所以,如果你有自己的Thread类MyOwnThread extends Thread,写这样的事:

MyOwnThread myOwnThread = new MyOwnThread(); 
myOwnThread.setPriority(...); 

myOwnThread的优先级的影响。但如果你写这样的东西:

public static void main(String[] args) { 
    ... 
    Thread.getCurrentThread().setPriority(...); 
    ... 
} 

您正在影响java-main-thread

+0

很好解释。 –

+0

嗨,所以我读的是错误的,那么调用线程的优先级不会受调用setPriority()影响,它是受影响的调用(不是调用)线程的优先级,这可能与如果当前线程正在使用对自身的引用,则调用线程,如上例所示。因此,它基本上是其调用优先级的调用线程对象(调用该方法的对象)。那还是什么东西仍然在这里失踪! – Searcherer

+1

优先级是在类Thread.java中设置的字段。像其他任何类一样,您可以在对象上调用该方法,然后调用其调用受影响方法的对象。它简单的'.'运算符规则:'referenceOfObjectA.alterState()'将会改变对象A的状态。如果这个方法在类A中被调用,那么'referenceOfObjectA'将被隐式引用'this '。 –

1

真正重要的部分在这里:优先只有推荐给底层操作系统。

换句话说:在Java中使用线程优先级的结果完全取决于事情JVM版本,操作系统类型,操作系统版本,...

长话短说:依靠它们是浪费时间。因为机会非常接近于零,所以使用这个概念将导致预期的结果。

[个人观点:我最近花了几个小时试图编写基于优先级的Java线程来显示优先级的影响 - 没有解决;既不适用于Windows,也不适用于Linux]