这一章节我们来讨论一下多线程的优先级问题。

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)-优先级的更多相关文章

  1. java多线程系列六、线程池

    一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池. 2. 使用线程池的好处 a) 降低资源的消耗.使用线程池不用频繁的创建线程和销毁线程 b) 提高响应速度,任 ...

  2. java多线程面试题_线程并发面试题

    1.什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个 ...

  3. Java(279-298)【异常、线程】

    1.异常的概念&异常的体系 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将 受影响.在程序中的意思就是: 异常 :指的是程序在执行过 ...

  4. Java中的进程和线程

     Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...

  5. Java中的进程与线程(总结篇)

    详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...

  6. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  7. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  8. java查看当前项目所有线程列表界面

    java查看当前项目所有线程列表界面 1.TestThread(测试类) package com.isoftstone.pcis.isc.job.king.panel; public class Te ...

  9. Java多线程与并发库高级应用-传统线程机制回顾

    1.传统线程机制的回顾 1.1创建线程的两种传统方式 在Thread子类覆盖的run方法中编写运行代码 // 1.使用子类,把代码放到子类的run()中运行 Thread thread = new T ...

  10. java多线程系列7-停止线程

    本文主要总结在java中停止线程的方法 在java中有以下三种方法可以终止正在运行的线程: 1.使用退出标志 2.使用stop方法强行终止线程,但是不推荐,因为stop和suspend.resume一 ...

随机推荐

  1. Linux 系统及编程相关知识总汇

    Linux  C function() 参考手册 STL 学习文档 Linux内核

  2. Xtreme9.0 - Pattern 3 KMP

    Pattern 3 题目连接: https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/car-spark Descr ...

  3. Codeforces Round #369 (Div. 2) D. Directed Roads 数学

    D. Directed Roads 题目连接: http://www.codeforces.com/contest/711/problem/D Description ZS the Coder and ...

  4. 手机浏览器跳转APP

    背景 对于APP来说,回流分享页是最好的最便宜的也是最病毒式的拉新方式.让新用户去下载APP是重要的.对老用户来说,可以直接调起APP也是提升用户体验和让用户有侵入式体验的重要手段.所以我们一起来看看 ...

  5. stm32f103串口实现映射功能

    在实际开发中,常常遇到串口的默认输出IO口被其它模块占用了,所以我们要用到串口IO口映射功能.是指将原来实现功能的IO口映射到其它指定IO口,其它不变.详细操作例如以下: 先贴出默认下的串口初始化设置 ...

  6. 如何运行Hadoop自带的例子

    bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar wordcount /WordCount/WordC ...

  7. Team Foundation Server (TFS) 2015 安装指导

    1. 概述 微软于8月6日发布了大家期待已久的TFS 2015正式版, https://www.visualstudio.com/en-us/news/tfs2015-vs.aspx ,新版本包含的大 ...

  8. EditPlus(4.0.0.395)中文免激活绿色版

    EditPlus一套功能强大,可取代记事本的文字编辑器,拥有无限制的撤消与重做.英文拼字检查.自动换行.列数标记.搜寻取代.同时编辑多文件.全屏幕浏览功能.而它还有一个好用的功能,就是它有监视剪贴板的 ...

  9. 在Visual Studio中使用类图描述领域模型

    右键解决方案,添加一个名称为"Domain Model"的UML类图. 首先站在整体的角度添加类,先不要任何属性. 添加Customer对Wishlist的关联,把"属性 ...

  10. 沉浸式Web初体验

    沉浸就是让人专注在当前的情境下感到愉悦和满足,而忘记真实世界的情境.心流理论能有力解释人们废寝忘食地投入一件事情的状态. 心流理论的核心就是说当人的技能与挑战最佳匹配时能达到心流状态.比如玩一个游戏, ...