[Java]线程优先级问题
2017-09-12 16:21
309 查看
对于线程优先级,需要注意:
Thread.setPriority()可能根本不做任何事情,这跟你的操作系统和虚拟机版本有关线程优先级对于不同的线程调度器可能有不同的含义,可能并不是你直观的推测。特别地,优先级并不一定是指CPU的分享。在UNIX系统,优先级或多或少可以认为是CPU的分配,但Windows不是这样
线程的优先级通常是全局的和局部的优先级设定的组合。Java的setPriority()方法只应用于局部的优先级。换句话说,你不能在整个可能的范围 内设定优先级。(这通常是一种保护的方式,你大概不希望鼠标指针的线程或者处理音频数据的线程被其它随机的用户线程所抢占)
不同的系统有不同的线程优先级的取值范围,但是Java定义了10个级别(1-10)。这样就有可能出现几个线程在一个操作系统里有不同的优先级,在另外一个操作系统里却有相同的优先级(并因此可能有意想不到的行为)
操作系统可能(并通常这么做)根据线程的优先级给线程添加一些专有的行为(例如”only give a quantum boost if the priority is below X“)。这里再重复一次,优先级的定义有部分在不同系统间有差别。
大多数操作系统的线程调度器实际上执行的是在战略的角度上对线程的优先级做临时操作(例如当一个线程接收到它所等待的一个事件或者I/O),通常操作系统知道最多,试图手工控制优先级可能只会干扰这个系统。
你的应用程序通常不知道有哪些其它进程运行的线程,所以对于整个系统来说,变更一个线程的优先级所带来的影响是难于预测的。例如你可能发现,你有一个预期 为偶尔在后台运行的低优先级的线程几乎没有运行,原因是一个病毒监控程序在一个稍微高一点的优先级(但仍然低于普通的优先级)上运行,并且无法预计你程序 的性能,它会根据你的客户使用的防病毒程序不同而不同。
实际编码注意
不要假定高优先级的线程一定先于低优先级的线程执行,不要有逻辑依赖于线程优先级,否则可能产生意外结果。
摘自博客
相关文章推荐
- [Java]线程的优先级问题,困扰多日,已解决!
- java多线程程序设计二、线程返回值,优先级以及暂停的问题
- 关于java线程优先级的问题
- Java线程优先级和线程暂停恢复的问题
- Java线程:线程的调度-优先级
- java高级多线程编程--关于线程的停止问题
- java高级多线程编程--关于线程的停止问题
- java高级多线程编程(一)--关于线程的停止问题
- java高级多线程编程--关于线程的停止问题
- 如果我是国王:关于解决 Java 编程语言线程问题的建议
- 串口接收线程退出与优先级问题
- JAVA线程之二:线程的调度及优先级
- Java线程:线程的调度-优先级
- 两个线程,一音/一视频udp数据包,优先级问题,在线等!
- 生产者消费者问题之Java线程实现
- JAVA线程间通信问题
- Java Puzzlers笔记--puzzle 13: Animal Farm 优先级以及对象引用问题
- java高级多线程编程(一)--关于线程的停止问题
- 两个线程,一音/一视频udp数据包,优先级问题,在线等!
- Java线程基本用法与同步问题