Thread.setPriority()和android.os.Process.setThreadPriority()有什么区别


71

如果我有类似的代码:

Runnable r = ...;

Thread  thread = new Thread(r);
thread.setPriority((Thread.MAX_PRIORITY + Thread.NORM_PRIORITY) / 2);

要么 ...

    Runnable r = ...
    Thread thread = new Thread( new Runnable() {
       public void run() {
         android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_MORE_FAVORABLE);
         r.run();
       }
    });

是否需要android.os.Process方法/首选?

为什么首选android.os.Process方法?

据我所知,这还没有明确记录。

Answers:


36

如您所说,当前的Dalvik实现似乎将Java线程一一映射到底层Linux系统PTHREADs。所有应用程序的所有线程都属于系统上的同一线程组,因此每个线程都与所有应用程序的所有线程竞争。

因此,当前Thread.setPriority实际上应该Process.setThreadPriority使用较小的Java优先级尺度与进行相同的操作。优先级的映射kNiceValuesvm / Thread.c中定义


因此,似乎似乎首选process.setthreadpriority,因为dalvik使用了一组公开定义的优先级,而对于thread.priority,它是一个非公共的映射。凉。
Greg Giacovelli 2011年

1
我只是以为它们都以相同的OS api调用结束,所以唯一的区别是优先级值的大小。这意味着甚至Thread.setPriority设置了一个与所有应用程序的线程竞争的价值。因此,采用哪种方法的决定仅是未来安全性的问题,也许是应用程序线程是否被分组一次……
dronus 2011年

1
嘿Dronus,是的,他们俩都调用了正确的pthread调用。但是,使用Thread.setPriority()时,使用的比例为0-10;在Process.setThreadPriority()中,则使用的比例为(+/- 20)。所以是的,nice更细粒度,但是当提供的OS lib声明了被认为是合理且明智的优先级集时,Thread.MIN_PRIORITY,NORMAL和MAX PRIORITY却没有那么多信息,有些随意。谁知道10点制比例尺之间的映射会是什么样子。没有什么说它是线性的。
2011年

映射kNiceValues如上所述定义。该表不是线性的,但是线性并不意味着任何意义,因为它取决于调度程序,这些值的含义是什么,例如,通常仅考虑顺序。总是偏爱一个过程,它具有较低的好价值,而另一个独立地是多么低。因此,真正的效果是相对于系统中使用的所有美观值而言的,因此取决于操作系统制造商和所有其他应用程序编码器策略。android值具有一些命名的C常数,其后缀为_NORMAL_URGENT_DISPLAY,并假装一些含义……
dronus 2011年

我了解如何使用nice以及优先级如何工作。我只是说在Process.setThreadPriority中定义的顺序和小数位数可能比和谐内部java.util.Thread上的任意映射更合理,因为实际上这是用于定义其余部分的优先级组的东西系统。无论如何,这是有争议的。
格雷格·贾科沃利

6

Google使用

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

在Volley的Network Dispatcher线程中,所以我相信使用Process.setThreadPriority()是可行的方法。


8
不好意思投票,因为“ google使用它”不是一个好的答案。实现占答案首选..
Lassi的Kinnunen

2
您知道谁编写了Google的所有代码吗?一堆只懂得编写完美代码的巫师和巫婆。
Chase Roberts

赞成,因为这实际上是一个很好的答案。对于那些不知道的人,Volley库一直是Google产品,由“ Android开源项目”正式发布,记录在“ developer.android.com”上,直到2012年,甚至在Android存储库中的“ frameworks”下也是如此。 /支持”。虽然该特定的API使用是在一个非相关引入提交没有具体说明或解释(库过渡期间):github.com/google/volley/commit/...
CAW

2

我会依靠的thread.setPriority()。这些android.os.Process.setThreadPriority名称是底层Linux操作系统的真正线程优先级。但是,这些可以但不必映射到Dalvik / Java VM线程,因为VM可以以自己的方式进行线程处理,也可以使用系统线程或两者结合使用。如果不受Android安全性限制,提高系统优先级可能会导致您的应用程序优先于其他应用程序,但又不能保证您的当前Java线程优先于您的应用程序中的其他Java线程。


我不知道 即使在现代的UNIX机器上,java vm也会使用本机线程模型。我已经研究了Process.setThreadPriority的实现,是的,它确实直接在Linux中设置了本机线程优先级。但是,由于Thread.MAX_PRIORITY-Thread.MIN_PRIORITY仅距离〜10,因此似乎几乎是一种更详尽的方法。创建在操作系统内交错的线程模型似乎很麻烦,并且对嵌入式设备几乎没有好处。我必须认为,除了您的建议之外,还有更多内容。
Greg Giacovelli 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.