多线程的优先级问题

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

线程的优先级

在操作系统中,线程可以划分优先级,。尽可能多的给优先级高的线程分配更多的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. MessagePack Java 0.6.X 可选字段

    你可添加一个新的字段来保持可用性.在新字段中使用 @Optional 注解. @Message public static class MyMessage {     public String na ...

  2. Taro 遇到的坑

    1.createSelectorQuery无法获取节点宽高 业务场景: 列表需要在最后一页底部显示 ‘我是有底线的~’ 提示,但是如果数据只有一页且不占满屏幕的话,就不显示.需要判断 ‘我是有底线的~ ...

  3. 记一次protobuf和hbase自带protobuf版本冲突的解决

    使用protobuf生产模板代码,使用的版本是: <dependency> <groupId>com.google.protobuf</groupId> <a ...

  4. 关于自定义sparkSQL数据源(Hbase)操作中遇到的坑

    自定义sparkSQL数据源的过程中,需要对sparkSQL表的schema和Hbase表的schema进行整合: 对于spark来说,要想自定义数据源,你可以实现这3个接口: BaseRelatio ...

  5. linux安装mysql以及修改密码和重启mysql等相关命令

    Linux/UNIX 上安装 MySQL Linux平台上推荐使用RPM包来安装Mysql,MySQL AB提供了以下RPM包的下载地址: MySQL - MySQL服务器.你需要该选项,除非你只想连 ...

  6. Nginx事件管理之epoll模块

    1. epoll 原理 假设有 100 万用户同时与一个进程保持着 TCP 连接,而每一时刻只有几十个或几百个 TCP 连接时活跃的(接收到 TCP 包),也就是说,在每一时刻,进程只需要处理这 10 ...

  7. python基础_0623

    命名的规则: project name    package name    python file name 1. 不能以数字开头,不能使用中文 2. 不能使用关键字 3. 英文    字母    ...

  8. ILSpy C# language support status

    C# language support status Asynchronous methods 已经支持 Generalized async return types  还不支持 Async main ...

  9. Java操作符——i++ 和 ++i的区别

    问题:前置自增和后置自增的区别 Code-后置自增 public class Test { public static void main(String[] args) { int a = 2; in ...

  10. Copy-On-Write in Swift

    Premature optimisation is the root of all evil. But, there are moments where we need to optimise our ...