Java多线程 - 线程优先级

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:

避免使用线程优先级的诱惑,因为它们会增加平台依赖性并导致活动问题.大多数并发应用程序可以使用所有线程的默认优先级.

  • @TwoThe在我这样评论之前阅读我提到的那本书. (2认同)

Col*_*lin 5

线程优先级只是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,因为你无论如何都不能依赖它.(当然有一些场景有意义)