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

Gre*_*lli 68 android

如果我有以下代码:

Runnable r = ...;

Thread  thread = new Thread(r);
thread.setPriority((Thread.MAX_PRIORITY + Thread.NORM_PRIORITY) / 2);
Run Code Online (Sandbox Code Playgroud)

要么 ...

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

android.os.Process方式需要/首选吗?

为什么 android.os.Process方式首选/必需?

据我所知,目前尚未明确记录.

dro*_*nus 33

当前的Dalvik实现似乎将Java Threads ony映射到底层的Linux系统PTHREAD就像你说的那样.所有应用程序的所有线程都属于系统上的同一个线程组,因此每个线程都与所有应用程序的所有线程竞争.

因此,目前Thread.setPriority实际应该这样做Process.setThreadPriority,使用较小的Java优先级标度,优先级的映射kNiceValuesvm/Thread.c中定义

  • 我只是认为它们最终都会调用相同的 OS api,所以唯一的区别是优先级值的大小。这意味着即使是 `Thread.setPriority` 也会设置一个与所有应用程序线程竞争的值。因此,对于任一方法的决定仅仅是未来安全性的问题,也许如果应用程序线程被分组一次...... (2认同)
  • 嘿 Dronus,是的,他们都调用了正确的 pthread 调用。但是,使用 Thread.setPriority() 您使用的是 0-10 的比例,而在 Process.setThreadPriority() 上您使用的是不错的比例(+/- 20)。所以是的,nice 的粒度更细,但 Thread.MIN_PRIORITY、NORMAL 和 MAX PRIORITY 没有那么丰富,并且当提供的 OS lib 声明一组被认为是预期和合理的优先级时,有些随意。谁知道未来 10 点比例尺之间的映射会是怎样的。没有什么说它是线性的。 (2认同)

Phi*_*o99 6

谷歌使用

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
Run Code Online (Sandbox Code Playgroud)

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

  • downvoted因为"google使用它"并不是一个好的答案抱歉.实施会计答案首选.. (6认同)
  • 您知道谁编写了 Google 的所有代码吗?一群只知道如何编写_完美_代码的巫师。 (3认同)
  • 投票因为这实际上是一个“很棒”的答案。对于那些不知道的人来说,Volley 库一直是 Google 产品,由“Android 开源项目”正式发布,记录在“developer.android.com”上,直到 2012 年甚至在 Android 存储库的“frameworks”下/支持”。尽管特定的 API 用法是在不相关的提交中引入的,没有具体的描述或解释(在存储库转换期间):https://github.com/google/volley/commit/6772bce3d3322ccbcf6481545ffe895d5d401b39#diff-9c5b857672d17049cfa43a465bbe3a2e80383d5d346e7fb 0bf3cc89d2b1cf162 (3认同)