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 线程:进程中负责程序执行的 ...
随机推荐
- webpack搭建多页面系统(一):对webpack 构建工具的理解
为什么使用webpack构建工具? 1.开发效率方面: 在一般的开发过程中,分发好任务后,每个人完成自己单独的页面,如果有的人开发完成之后,接手别人的任务,就有可能造成开发时候的冲突. 如果利用模块化 ...
- C++入门经典-例7.9-对象数组,批量化生产
1:在数组内容中我们了解到,数组是通过指针分配到的一段额定大小的内容.同样,数组也可以包含对象.声明对象数组的形式如下: box boxArray[5]; box boxArray2[2]={box( ...
- 在linux下通过ssh运行X图形软件
服务器端:编辑/etc/ssh/sshd_config中的以下内容启用AllowTcpForwarding启用X11Forwarding将X11DisplayOffset设定为10. 启用X11Use ...
- git合并同事代码
git 操作: 如果龙哥提交了代码,我想拉去过来,我需要的操作: 1.git fetch 2. git add . 3.git commit -m '' 提交本地的文件 4.git merge ori ...
- DP&图论 DAY 5 上午
DP&图论 DAY 5 上午 POJ 1125 Stockbroker Grapevine 有 N 个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径.现在有一个消息要由某个人开 ...
- ECMAScript 6 异步编程
http://www.ruanyifeng.com/blog/2015/04/generator.html
- 安德鲁1.2Ku使用感受
看中玻璃钢天线了,华达太贵,安德鲁性价比比较高.就在上周,决定入一个试试.周二微信转账,380+120运费,安能物流送货上门,上周6中午午睡时接到电话.去广场拿货. 锅面包装很简单,纸壳与胶带简单粗暴 ...
- golang(09) golang 接口内部实现
原文链接 http://www.limerence2017.com/2019/09/24/golang14/#more 前文介绍过golang interface用法,本文详细剖析interface内 ...
- 【转】Java从hdfs上读取文件中的某一行
[From]https://blog.csdn.net/u010989078/article/details/51790166 package test; import java.io.Buffere ...
- C# 函数返回多个值的方法
有时候我们需要一个函数返回多个值,网上更多是用out实现,我个人很喜欢用tuple方法. tuple是一个元组,最多支持7个元素,再多需要嵌套等方法实现. 使用元组定义函数的方法如下: public ...