我正在网上阅读主题 setPriority(),并遇到以下情况:
final void setPriority(int level)
此处,level指定调用线程的新优先级设置。
来源:http://www.java-samples.com/showtutorial.php?tutorialid=302
我不明白 setPriority()如何改变调用线程的优先级:不应该影响调用它的对象,被调用者?因此,如果我从 main()调用该方法,那么 main()的优先级会被更改吗?这肯定在我看来是反直觉的......
除非我不理解调用线程的含义,否则
。答案 0 :(得分:2)
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
。
答案 1 :(得分:2)
在setPriority
https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#setPriority(int)
优先级有助于线程调度程序在分配CPU时决定哪个线程优先。默认情况下,主线程开始执行java程序。开发人员可以创建自定义的Thread.java对象。当这些线程启动时,由线程的Thread.java
方法启动的代码在其特定线程的执行路径中执行。每个线程都由方法调用堆栈支持。主线程的默认优先级为5.创建的任何线程都具有与创建其执行路径的线程相同的优先级值。
您需要一个可以调用(调用)方法的对象。
当你说" ...如果我从main()调用方法时,你是什么意思,..." ?你不能在没有任何线程实例的情况下调用它。您可以创建一个Thread实例,然后在其上调用方法run
。执行此操作将设置调用方法的线程的优先级。
setPriority
上面将创建一个线程实例并将其优先级设置为等于当前正在执行的线程,如果其主线程默认情况下其优先级设置为5.
Thread usedDefinedThreadReference = new Thread();
usedDefinedThreadReference.setPriority(2);
Above将当前正在执行的线程的优先级设置为6.
Thread.currentThread().setPriority(6);
答案 2 :(得分:2)
这里非常重要的部分:优先级 仅对底层操作系统的推荐。
换句话说:在Java中使用线程优先级的结果完全取决于JVM版本,操作系统类型,操作系统版本等......
长话短说:依靠它们是时间的浪费。因为机会非常接近零,使用这个概念将导致预期的结果。
[个人观点:我最近花了几个小时试图编写基于优先级的Java线程,只是为了显示优先级的影响 - 没有成功;既不适用于Windows,也适用于Linux]