java多线程的优先性问题
多线程的优先级问题
重点:理解线程优先级的继承性、规则性、随机性
线程的优先级
在操作系统中,线程可以划分优先级,。尽可能多的给优先级高的线程分配更多的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多线程的优先性问题的更多相关文章
- Java多线程:synchronized的可重入性
从Java多线程:线程间通信之volatile与sychronized这篇文章中我们了解了synchronized的基本特性,知道了一旦有一个线程访问某个对象的synchronized修饰的方法或代码 ...
- Java多线程干货系列—(一)Java多线程基础
前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...
- Java多线程编程核心技术---Java多线程技能
基本概念 进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据结构在处理机上顺序执行时所发生的活动,是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的独立单位.线程可以理解成是在进 ...
- Java多线程干货系列(1):Java多线程基础
原文出处: 嘟嘟MD 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程 ...
- java多线程系列8-线程的优先级
在java中设置线程优先级使用setPriority,在jdk中的源代码如下: public final void setPriority(int newPriority) { ThreadGroup ...
- [转]Java多线程干货系列—(一)Java多线程基础
Java多线程干货系列—(一)Java多线程基础 字数7618 阅读1875 评论21 喜欢86 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们 ...
- 【转】 Java 多线程之一
转自 Java 多线程 并发编程 一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进 ...
- Java多线程编程总结(精华)
Java多线程编程总结 2007-05-17 11:21:59 标签:多线程 java 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http ...
- 【Java学习笔记之三十四】超详解Java多线程基础
前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...
随机推荐
- K8S中DaemonSet
DaemonSet DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本.当有 Node 加入集群时,也会为他们新增一个 Pod .当有 Node 从集群移除时,这些 Pod ...
- java中MD5函数
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5U ...
- 四、SpringBoot整合mybatis——配置mybatis驼峰命名规则自动转换
简述: mybatis驼峰式命名规则自动转换: 使用前提:数据库表设计按照规范“字段名中各单词使用下划线"_"划分”:使用好处:省去mapper.xml文件中繁琐编写表字段列表与表 ...
- JSP通过URL给Servlet传值
jsp传数据: <a id="a1" href="" ></a> <script> $("#a1").a ...
- 关于hive on spark会话的共享状态
spark sql中有一个类: org.apache.spark.sql.internal.SharedState 它是用来做: 1.元数据地址管理(warehousePath) 2.查询结果缓存管理 ...
- JIRA绑定邮箱
[管理-系统-外发邮件] 之前配置QQ邮箱没有成功,后来使用阿里邮箱一次就成功了 [保存]成功后可以测试一下
- Linux-expect脚本-编写一个expect脚本
1.声明expect #!/usr/bin/expect -f 2.设置超时时间,获取参数 set ip [lindex $argv 0 ] //接收第一个参数,并设置IP set password ...
- Requests 代理池
Requests 本身不提供代理池,然而爬数据又要用,所以只能自己搞.其实还挺简单的.我也不知道为什么这么有用的 feature 一直没有被加入. import requests class Clie ...
- Mybatis不使用Spring框架(Druid)
1.Mysql database CREATE TABLE mockrecord (id INT(10) unsigned PRIMARY KEY NOT NULL COMMENT 'mock记录编号 ...
- 【黑马JavaSE】1_1_11_IDEA、12_方法、13_重载
文章目录 1_1_11_01开发工具IntelliJ IDEA 1.3 创建包.查看包的目录结构 1.5 字体设置(File->Settings->Editor->Font) 1.6 ...