Nea*_*eal 11 java multithreading thread-priority
任何人都可以解释线程优先级如何在java中工作.这里的困惑是,如果java不保证Thread根据其优先级的实现,那么为什么这个setpriority()函数用于.
我的代码如下:
public class ThreadSynchronization implements Runnable{
public synchronized void run() {
System.out.println("Starting Implementation of Thread "+Thread.currentThread().getName());
for(int i=0;i<10;i++)
{
System.out.println("Thread "+Thread.currentThread().getName()+" value : "+i);
}
System.out.println("Ending Implementation of Thread "+Thread.currentThread().getName());
}
public static void main(String[] args) {
System.out.println("Program starts...");
ThreadSynchronization th1 = new ThreadSynchronization();
Thread t1 = new Thread(th1);
t1.setPriority(1);
synchronized(t1)
{
t1.start();
}
ThreadSynchronization th2 = new ThreadSynchronization();
Thread t2 = new Thread(th2);
t2.setPriority(9);
synchronized (t2) {
t2.start();
}
System.out.println("Program ends...");
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的程序中,即使我改变优先级,我发现输出没有区别.另外,如何使用线程优先级的实时应用将会有很大帮助.谢谢.
Try*_*ing 11
线程优先级只是OS任务调度程序的提示,并且依赖于底层操作系统.操作系统将尝试为高优先级线程分配更多资源,但不保证.因此,如果您的程序依赖于线程优先级而不是将程序绑定到底层操作系统,这很糟糕.
来自Java Concurrency in Practice:
避免使用线程优先级的诱惑,因为它们会增加平台依赖性并导致活动问题.大多数并发应用程序可以使用所有线程的默认优先级.
线程优先级只是OS任务调度程序的提示.任务调度程序只会尝试将更多资源分配给具有更高优先级的线程,但是没有明确的保证.
实际上,它不仅与Java或JVM相关.大多数非实时操作系统仅以建议的方式使用线程优先级(托管或非托管).
同样非常重要的是,Priorties与每个底层平台都不同.因此,你有点松散你的平台java自由.请参阅此摘要:
实际上,某些优先级可以映射到相同的"本机"优先级.这是列表(基于OpenJDK 6中的热点代码):
的Solaris
1⇒0
2⇒32
3⇒64
4⇒96
5 - - 10 127⇒
值得注意的是,在Solaris,则不能提高上述正常线程优先级,只降低它:5的优先级值是一样的任何更高的价值观.
Linux
1 - 10⇒4 - -5(漂亮的值)值得注意的是,在Linux上,Java中的不同线程优先级确实映射到本机级别的不同优先级值.
Windows
1 - 2⇒THREAD_PRIORITY_LOWEST3
- 4⇒THREAD_PRIORITY_BELOW_NORMAL5
- 6⇒THREAD_PRIORITY_NORMAL7
- 8⇒THREAD_PRIORITY_ABOVE_NORMAL9
- 10⇒THREAD_PRIORITY_HIGHEST
我已经开发了很多多线程java应用程序,在我看来,如果你必须设置优先级,你还有另一个问题.就像一个耗费大量CPU时间等的糟糕的algorythm ....我总是建议不要改变java线程prio,因为你无论如何都不能依赖它.(当然有一些场景有意义)