多线程的优先级问题

重点:理解线程优先级的继承性、规则性、随机性

线程的优先级

在操作系统中,线程可以划分优先级,。尽可能多的给优先级高的线程分配更多的CPU资源。

线程的优先级分为1~10,有三个预定义常量:

public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;//默认
public final static int MAX_PRIORITY = 10;

优先级继承性

优先级具有继承性(由线程a启动的线程b的优先级与a相同),比较简单,略。

优先级的规则性

这里的规则性,指的是高优先级的线程往往能获得更多的CPU资源,更快的执行完(当然不是必然,“随机性”)

下面测试说明:

先继承Thread创建PriorityThread

package foreverly.cn.chapter1;
import java.util.Random;
public class PriorityThread extends Thread {
private String show;
public PriorityThread(String show) {
super();
this.show = show;
}
@Override
public void run() {
long beginTime = System.currentTimeMillis();
long addResult = 0;
for (int j = 0; j < 10; j++) {
for (int i = 0; i < 50000; i++) {
Random random = new Random();
random.nextInt();
addResult = addResult + i;
}
}
long endtime = System.currentTimeMillis();
System.out.println(show + " " + "时间:" + (endtime - beginTime));
}
}

再创建测试

package foreverly.cn.chapter1;
public class TestPrority {
public static void main(String[] args) {
for (int i = 0; i<5; i++) {
PriorityThread thread1 = new PriorityThread("1 1 1 1 1 1");
PriorityThread thread2 = new PriorityThread("2 2 2 2 2 2 ");
thread1.setPriority(10);
thread2.setPriority(1);
thread1.start();
thread2.start();
}
}
}

多运行几次,运行结果为:

第一次:

1 1 1 1 1 1   时间:1344
1 1 1 1 1 1 时间:1344
1 1 1 1 1 1 时间:1457
1 1 1 1 1 1 时间:1466
1 1 1 1 1 1 时间:1483
2 2 2 2 2 2 时间:1544
2 2 2 2 2 2 时间:1546
2 2 2 2 2 2 时间:1557
2 2 2 2 2 2 时间:1558
2 2 2 2 2 2 时间:1559

线程thread1的优先级高于thread2,优先执行完。

第二次:

1 1 1 1 1 1   时间:1126
1 1 1 1 1 1 时间:1406
2 2 2 2 2 2 时间:1601
1 1 1 1 1 1 时间:1616
2 2 2 2 2 2 时间:1644
2 2 2 2 2 2 时间:1644
1 1 1 1 1 1 时间:1650
1 1 1 1 1 1 时间:1661
2 2 2 2 2 2 时间:1661
2 2 2 2 2 2 时间:1666

但这种优先具有随机性,而非必然优先。从第二次输出结果来看,总体还是thread1运行快,但是也有thread2比thread1运行快的情况。下面介绍线程的随机性。

线程的随机性

优先级具有随机性!是一种“趋势”而非“必然”。

我们可以通过设置优先级的方式,让CPU尽量将执行资源分配给优先级较高的线程,但是这并不意味着优先级高的线程一定先执行完,这是因为线程的优先级还具有“随机性”,也就是说线程优先级较高的线程不一定每次都先执行完(注意:这并不一定是由线程任务量导致的,即使任务量相同的情况下优先级低的线程也有可能先执行完)。

从上面的第二次的输出结果可以看出,所有线程执行的任务量是相同的 ,但还是出现了优先级低的thread2比优先级高的thread1先执行完的情况。

java多线程的优先性问题的更多相关文章

  1. Java多线程:synchronized的可重入性

    从Java多线程:线程间通信之volatile与sychronized这篇文章中我们了解了synchronized的基本特性,知道了一旦有一个线程访问某个对象的synchronized修饰的方法或代码 ...

  2. Java多线程干货系列—(一)Java多线程基础

    前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...

  3. Java多线程编程核心技术---Java多线程技能

    基本概念 进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据结构在处理机上顺序执行时所发生的活动,是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的独立单位.线程可以理解成是在进 ...

  4. Java多线程干货系列(1):Java多线程基础

    原文出处: 嘟嘟MD 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程 ...

  5. java多线程系列8-线程的优先级

    在java中设置线程优先级使用setPriority,在jdk中的源代码如下: public final void setPriority(int newPriority) { ThreadGroup ...

  6. [转]Java多线程干货系列—(一)Java多线程基础

    Java多线程干货系列—(一)Java多线程基础 字数7618 阅读1875 评论21 喜欢86 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们 ...

  7. 【转】 Java 多线程之一

    转自   Java 多线程 并发编程 一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进 ...

  8. Java多线程编程总结(精华)

    Java多线程编程总结 2007-05-17 11:21:59 标签:多线程 java 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http ...

  9. 【Java学习笔记之三十四】超详解Java多线程基础

    前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...

随机推荐

  1. 交换机配置——VTP管理交换机的VLAN配置

    一.实验目的:将S1配置成VTP-Server,S2配置成VTP-Transparent,S3配置成VTP-Client,S4配置成VTP-Client 二.拓扑图如下 三.具体步骤: (1)S1交换 ...

  2. 状压dpHDU - 4856

    J - Tunnels HDU - 4856 题目大意:地图上有些管道,在管道行走里不需要花费时间,但从一个管道的出口走到另一个管道的入口则需要花费时间,问走完所有管道最短的时间,如果不行,则输出-1 ...

  3. sh_18_字符串文本对齐

    sh_18_字符串文本对齐 # 假设:以下内容是从网络上抓取的 # 要求:顺序并且居中对齐输出以下内容 poem = ["\t\n登鹳雀楼", "王之涣", & ...

  4. mac使用sublime text3打开当前文件夹的终端

    打开sublime text3,同时按住shift+command+p打开扩展列表, 选择Package Control: Install Pageage,回车. 在输入框输入: terminal,回 ...

  5. jQuery的replaceWith()函数用法详解

    replaceWith,替换元素 replaceWith() 方法将选择的元素的内容替换为其他内容. 我们先在先看一个实例 <!DOCTYPE html> <html> < ...

  6. 在.slurm文件中激活Anaconda环境

    超算中心使用slurm作为集群调度.原始slurm脚本如下: source activate tensorflow-gpu python neural_style.py --content conte ...

  7. Python——语言基础

    1.数据类型 1.1.字符串 1.1.1.变量声明 1.1.2.相关函数 1.2.布尔类型 1.2.1.变量声明 1.2.2.相关函数 1.3.数字类型 1.3.1.变量声明 1.3.2.相关函数 1 ...

  8. NullPointerException 没有堆栈

    周五在公司搭好的ELK上查看日志,组长让看看其中NullPointerException出现很多的原因. 通过NullPointerException搜索,点看其中一个查看,发现异常的信息就一行jav ...

  9. SprintBoot日志

    yml配置 #logging logging.file: "logs/app.log" logging: level: root: debug file: max-size: 10 ...

  10. springboot ---> spring ioc 注册流程 源码解析 this.prepareContext 部分

    现在都是在springboot 中 集成 spirng,那我们就从springboot 开始. 一:springboot 启动main 函数 public static void main(Strin ...