根据我过去的内容,我们鼓励您不要以编程方式更改Windows应用程序的优先级,如果这样做,则不应将其更改为"实时".
与"高"和"高于正常"相比,"实时"流程优先级设置有何作用?
在后C++ 11世界中设置std :: thread实例优先级的正确方法是什么
是否有一种可移植的方式,至少在Windows和POSIX(Linux)环境中有效?
或者是获取句柄并使用特定操作系统可用的本机调用的问题?
是否有可能为Executors执行的任务设置优先级?我在JCIP中发现了一些关于它可能的陈述,但我找不到任何例子,我找不到任何与文档相关的内容.
来自JCIP:
执行策略指定任务执行的"内容,位置,时间和方式",包括:
- ...
- 应该以什么顺序执行任务(FIFO,LIFO,优先顺序)?
- ...
UPD:我意识到我不确切地问我想问什么.我真正想要的是:
如何使用/模拟thread.setPriority()执行程序框架设置线程优先级(即什么)?
我有一个程序,运行在几个线程中.主线程与其他线程共享一个对象,在main中我有一个调用:
synchronized(obj){
do stuff
}
Run Code Online (Sandbox Code Playgroud)
我怀疑主线程是饿死的,无法访问obj.如何提高主线程的优先级或默认情况下它是否已高于其他线程?
写了一个快速的Java proggy以产生每个优先级的10个线程并计算pi(4*atan(1)方法),每个BigDecimals 500,000次,连接每个线程并报告run方法的已用时间.是的,可能不是最好的例子,但保持基本.
我知道Bug4813310
在C中做这件事并非易事,但是我们可以假设从未在Linux JVM上设置原生优先级吗?
$uname -r && grep bogomips /proc/cpuinfo
2.4.33.3
bogomips : 4312.26
$java -version 2>&1 |head -1
Java version "1.6.0_01"
$javac T.java && java -Xmx32m -XX:+UseThreadPriorities T
1:3112
2:2636
3:2662
4:3118
5:2870
6:3319
7:3412
8:3304
9:3299
10:3069
Run Code Online (Sandbox Code Playgroud)
看起来没有人会期待的偏差!那是在一台小型虚拟Linux机器上.也许只是Sun的?我们将尝试IBM J9 VM:
1:4091
2:4142
3:3957
4:3905
5:3984
6:3985
7:4130
8:4055
9:3752
10:4071
Run Code Online (Sandbox Code Playgroud)
相比之下,总数看起来相当不错,但从线程优先级的角度来看,数字没有规模.
让我们尝试使用旧版Sun JVM在2.6内核上进行500k次迭代,其中一个常常加载的平均负载很少低于7:
$uname -r && grep bogomips /proc/cpuinfo
2.6.9-67.ELsmp
bogomips : 3992.93
bogomips : 3990.00
$java -version 2>&1 |head -1
java version "1.4.2_14"
$javac …Run Code Online (Sandbox Code Playgroud) Web和Stack Overflow中有很多地方不鼓励改变ThreadPool线程或TPL 任务的优先级.特别是:
"你无法控制线程池线程的状态和优先级."
"运行时管理线程池.您无法控制线程的调度,也无法更改线程的优先级."
"你不应该改变PoolThread的文化或优先级......或者就像你没有画出或重新装修租赁汽车一样."
"在某些情况下,创建和管理自己的线程而不是使用线程池线程是合适的:(例如...)您需要一个线程具有特定的优先级."
"ThreadPool中的每个线程都以默认优先级运行,而更改ThreadPriority的代码无效."
但是,这样做很简单,调试器显示更改似乎确实存在(只要值可以回读).
Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
Run Code Online (Sandbox Code Playgroud)
所以问题是,这个禁忌的具体原因是什么?
我怀疑:这样做会扰乱游泳池的微妙负载平衡假设.但这并不能解释为什么有些消息来源说你无法改变它.
我正在考虑使用Web Workers在用户浏览我的网站时提供一些后台功能(这就是Web Workers的用途,对吧?).但是,我不想冒着通过导致延迟滚动,无响应控件等来破坏用户体验的风险.Web Worker被映射到OS线程上,因此我期望对这些线程的优先级进行一些控制,但是到目前为止据我所知,目前的API中没有这样的东西.你知道怎么做到这一点吗?即使有黑客攻击?
我的程序有一个后台线程,用于填充和交换双缓冲区实现的后台缓冲区.主线程使用前端缓冲区发送数据.问题是当我运行程序时,主线程平均获得更多的处理时间.我想要相反的行为,因为填充后台缓冲区是一个更耗时的过程,然后处理并向客户端发送数据.
如何在Linux上使用C POSIX pthreads实现这一目标?
我正在尝试使用更改主线程的优先级android.os.Process.setThreadPriority().我在优先级更改之前和之后都有日志消息,这里是代码:
public class TestActivity extends Activity {
public final String TAG="TestActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
int tid=(int)Thread.currentThread().getId();
Log.d(TAG,"priority before change = " + android.os.Process.getThreadPriority(tid));
Log.d(TAG,"priority before change = "+Thread.currentThread().getPriority());
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_DISPLAY);
Log.d(TAG,"priority after change = " + android.os.Process.getThreadPriority(tid));
Log.d(TAG,"priority after change = " + Thread.currentThread().getPriority());
}
}
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
priority before change (getThreadPriority) = 0
priority before change (currentThread().getPriority) = 5
priority after change (getThreadPriority) = 0
priority after change (currentThread().getPriority) = 5
Run Code Online (Sandbox Code Playgroud)
这意味着优先级没有改变,无论我用什么方法来评估它.
android.os.Process.THREAD_PRIORITY_DISPLAY = …
我理解优先级继承是什么.我也理解,从Mars Pathfinder的系统重置问题来看,大多数情况下,根据操作的重要性,启用/实现优先级继承是好的.
但是,是否存在不希望优先级继承的情况,如果启用/实现可能会导致问题?如果是这样,你能提供一个例子,最好是描述一个问题吗?
thread-priority ×10
java ×3
task ×2
.net ×1
android ×1
c ×1
c++ ×1
c++11 ×1
concurrency ×1
executor ×1
javascript ×1
jvm ×1
linux ×1
portability ×1
pthreads ×1
real-time ×1
scheduling ×1
stdthread ×1
taskmanager ×1
threadpool ×1
web-worker ×1
windows ×1