从头认识java-18.2 基本的线程机制(4)-优先级
来源:互联网 发布:淘宝seo是什么 编辑:程序博客网 时间:2024/05/19 13:22
这一章节我们来讨论一下多线程的优先级问题。
1.例子:
package com.ray.ch17;public class Test {public static void main(String[] args) {MyThead myThead = new MyThead();MyThead2 myThead2 = new MyThead2();for (int i = 0; i < 5; i++) {Thread thread = new Thread(myThead);thread.start();thread.setPriority(Thread.MIN_PRIORITY);}Thread thread2 = new Thread(myThead2);thread2.start();thread2.setPriority(Thread.MAX_PRIORITY);}}class MyThead implements Runnable {public void run() {for (int i = 1; i <= 3; i++) {System.out.println(Thread.currentThread() + "thread======>AAA");}}}class MyThead2 implements Runnable {public void run() {for (int i = 1; i <= 3; i++) {System.out.println(Thread.currentThread() + "thread======>BBB");}}}
输出:
Thread[Thread-5,10,main]thread======>BBB
Thread[Thread-5,10,main]thread======>BBB
Thread[Thread-5,10,main]thread======>BBB
Thread[Thread-0,1,main]thread======>AAA
Thread[Thread-0,1,main]thread======>AAA
Thread[Thread-0,1,main]thread======>AAA
Thread[Thread-2,1,main]thread======>AAA
Thread[Thread-3,1,main]thread======>AAA
Thread[Thread-3,1,main]thread======>AAA
Thread[Thread-3,1,main]thread======>AAA
Thread[Thread-1,1,main]thread======>AAA
Thread[Thread-1,1,main]thread======>AAA
Thread[Thread-1,1,main]thread======>AAA
Thread[Thread-2,1,main]thread======>AAA
Thread[Thread-2,1,main]thread======>AAA
Thread[Thread-4,1,main]thread======>AAA
Thread[Thread-4,1,main]thread======>AAA
Thread[Thread-4,1,main]thread======>AAA
从输出的结果可以看见,优先级至少在我的系统里面是起作用的。
解释:
(1)优先级可以通过setPriority来设置
(2)setPriority设置的时间应该在start之后,如果太靠前,有可能任务还没有开始
(3)优先级一般分成三个级别:max、min和norm
/** * The minimum priority that a thread can have. */ public final static int MIN_PRIORITY = 1; /** * The default priority that is assigned to a thread. */ public final static int NORM_PRIORITY = 5; /** * The maximum priority that a thread can have. */ public final static int MAX_PRIORITY = 10;
2.优先级的隐含问题(以下内容摘自http://silentlakeside.iteye.com/blog/1175981)
以下内容摘抄、翻译自 Java threading introduction -> Thread priorioties" href="http://www.javamex.com/tutorials/threads/priority.shtml" target="_blank">JAVAMEX -> Java threading introduction -> Thread priorioties
对于线程优先级,我们需要注意:
* 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-18.2 基本的线程机制(4)-优先级
- 从头认识java-18.2 基本的线程机制(5)-守护线程与非守护线程
- 从头认识java-18.2 基本的线程机制(3)-线程的返回与sleep
- 从头认识java-18.2 基本的线程机制(2)-Executors的使用
- 从头认识java-18.2 基本的线程机制(8)多线程的异常捕捉
- 从头认识java-18.2 基本的线程机制(1)-再识多线程-1
- 从头认识java-18.2 基本的线程机制(1)-再识多线程-2
- 从头认识java-18.2 基本的线程机制(7)join
- 从头认识java-18.2 基本的线程机制(6)-使用构造器或者内部类来实现多线程的编码变体
- 从头认识java-17.2 线程中断(interrupt)
- 从头认识java-11.4 正则表达式(2)-基本语法
- 从头认识Spring-2.8 基于java注解的配置(基本没有xml)
- 从头认识java-17.3 线程状态
- 从头认识多线程-1.14 优先级
- Java线程的基本机制
- 从头认识多线程-1.16 对比不同的优先级
- 从头认识java-4.8 数组的初始化(1)
- 从头认识java-10.6 finally(3)-异常的丢失
- Delphi 类方法的搞笑答案
- UVA 10534 - Wavio Sequence 最长上升子序列nlogn的应用
- 2016-01-17随笔
- 使用SwipeRefreshLayout和自定义listview实现下拉刷新上啦加载更多
- HF HTML&CSS第2版学习笔记(陆续更新)
- 从头认识java-18.2 基本的线程机制(4)-优先级
- IIS中添加对WCF服务的支持
- hdu1890 Robotic Sort(Splay)
- LayDate 时间选择插件的使用介绍
- Win7 32位MySQL5.6免安装配置编码为utf8——解决Java插入MySQL乱码问题
- MAVEN的安装详解
- Java Web开发过程中常遇的小问题
- 欢迎使用CSDN-markdown编辑器
- 计算机编程语言的学习过程推荐