Java 并发 线程的优先级

@author ixenos

低优先级线程的执行时刻


1.在任意时刻,当有多个线程处于可运行状态时,运行系统总是挑选一个优先级最高的线程执行,只有当线程停止、退出或者由于某些原因不执行的时候,低优先级的线程才可能被执行

2.两个优先级相同的线程同时等待执行时,那么运行系统会以round-robin的方式选择一个线程执行(即轮询调度,以该算法所定的)(Java的优先级策略是抢占式调度!)

3.被选中的线程可因为一下原因退出,而给其他线程执行的机会:

  1) 一个更高优先级的线程处于可运行状态(Runnable)

  2)线程主动退出(yield),或它的run方法结束

  3)在支持分时方式的系统上,分配给该线程的时间片结束

4.Java运行系统的线程调度算法是抢占式(preemptive)的,当更高优先级的线程出现并处于Runnable状态时,运行系统将选择高优先级的线程执行

5.例外地,当高优先级的线程处于阻塞状态且CPU处于空闲时,低优先级的线程也会被调度执行

 public class PriorityExample{
public static void main(Strinig[] args){
Thread a = new PThread("A");
Thread b = new PThread("B");
a.setPriority(7); //设置优先级
a.setPriority(1);
}
} class PThread extends Thread{
public PThread(String n){
super(n);
} public void run(){
for(int i=0; i<5000000; i++){
if(i%5000000 == 0){
System.out.print(getName());
}
}
}
}

输出 AAAAAAAAABBBBBBBBB

利己线程


1.一般地,在线程中可以调用sleep方法,放弃当前线程对处理器的使用,从而使各个线程均有机会得到执行,但有时候线程可能不遵循这个规则!

 public void run(){
for(int i=0; i<5000000; i++){
if(i%5000000 == 0){
System.out.print(getName());
}
}
}

2.for循环是一个紧密循环,一旦运行系统选择了有for循环体的线程执行,该线程就不会放弃对处理器的使用权,除非for循环自然终止或者该线程被一个有更高优先级的线程抢占,这样的线程称为利己线程

3.利己线程一般不引起问题,但有时会让其他的线程得到处理器使用权之前等待一段很长的时间

分时方式


1.为解决利己线程可能长时间占据CPU的问题,有些系统通过分时方式来限制利己线程的执行,如Windows2000或WindowsNT系统

2.在分时方式中,处理器的分配按照时间片来划分,对于那些具有相同最高优先级的多个线程,分时技术会交替地分配CPU时间片给他们执行,当时间片结束,即使该线程没有运行结束,也会让出CPU使用权

3.注释掉优先级设置后,输出变成了AAAAABBBBBAAABBB或者AABBAAAABBBBAABBA

 1 public class PriorityExample{
2 public static void main(Strinig[] args){
3 Thread a = new PThread("A");
4 Thread b = new PThread("B");
5 //a.setPriority(7); //设置优先级
6 //a.setPriority(1);
7 }
8 }
9
10 class PThread extends Thread{
11 public PThread(String n){
12 super(n);
13 }
14
15 public void run(){
16 for(int i=0; i<5000000; i++){
17 if(i%5000000 == 0){
18 System.out.print(getName());
19 }
20 }
21 }
22 }

而如果在另一个不支持分时技术的平台上运行程序,得到的输出结果可能是确定的! AAAAAAAAABBBBBBBBB

4.Java运行系统不实现分时,分时是和平台相关的,而有的平台不支持分时,在编写Java多线程程序的时候,不能过分依赖分时技术来保证各个线程都有公平的执行机会!通常应编写那种可以主动放弃处理器使用权的程序,同时一个线程也可以调用yield方法主动放弃对处理器的使用权

  注意:使用yield只能给同优先级的线程提供执行机会,如果没有同优先级的线程处于可运行状态,yield方法将被忽略!

Java 并发 线程的优先级的更多相关文章

  1. Java 并发 线程属性

    Java 并发 线程属性 @author ixenos 线程优先级 1.每当线程调度器有机会选择新线程时,首先选择具有较高优先级的线程 2.默认情况下,一个线程继承它的父线程的优先级 当在一个运行的线 ...

  2. Java 并发 线程的生命周期

    Java 并发 线程的生命周期 @author ixenos 线程的生命周期 线程状态: a)     New 新建 b)     Runnable 可运行 c)     Running 运行 (调用 ...

  3. Java 并发 线程同步

    Java 并发 线程同步 @author ixenos 同步 1.异步线程本身包含了执行时需要的数据和方法,不需要外部提供的资源和方法,在执行时也不关心与其并发执行的其他线程的状态和行为 2.然而,大 ...

  4. Java多线程——线程的优先级和生命周期

    Java多线程——线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...

  5. Java并发——线程介绍

    前言: 互联网时代已经发展到了现在.从以前只考虑小流量到现在不得不去考虑高并发的问题.扯到了高并发的问题就要扯到线程的问题.你是否问过自己,你真正了解线程吗?还是你只知道一些其他博客里写的使用方法.下 ...

  6. Java 并发--线程创建

    随着处理器的多核化,为提高处理器的资源利用率应用程序的并发变应运而生了.现在的操作系统是多任务操作系统,多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的内存空间 ...

  7. Java并发—线程池框架Executor总结(转载)

    为什么引入Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞 ...

  8. Java并发-线程池篇-附场景分析

    作者:汤圆 个人博客:javalover.cc 前言 前面我们在创建线程时,都是直接new Thread(): 这样短期来看是没有问题的,但是一旦业务量增长,线程数过多,就有可能导致内存异常OOM,C ...

  9. Java并发——线程安全、线程同步、线程通信

    线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...

随机推荐

  1. NSSortDescriptor(数组排序)

    如果数组里面的每一个元素都是一个个model,例如 DepartsDate.h文件 [plain] view plaincopy #import <Foundation/Foundation.h ...

  2. iOS获取程序运行平台

    下面这个博客里面写的很清楚 http://blog.sina.com.cn/s/blog_890a737301014fim.html

  3. Sqlserver 2008安装

    ##本文档所有安装操作都使用自动化脚本----###安装脚本的参数```#!setsaPassword=pass@word1 //sa数据库密码sqlComponent=SQLENGINE,REPLI ...

  4. MySQL能够承受上亿万条的数据量的架构

    MySQL能够承受上亿万条的数据量的架构 最近做的搜索引擎的数据量是越来越大估计了下在中国可能涉及到的1Kw的数据量,就全球来说也就是1K亿而已,最初是用的数据库是MySQL现在来说要做些优化,最终使 ...

  5. CDM业务单据,表体单价列赋值所需要注意的问题

    需要将销售退回入库单据的单价自动去商品资料里的零售价值. 写了检索方案,然后 select * .............    spkfk.lshj as dj.........  ,但是发现定价依 ...

  6. 典型的团队VS优秀团队

    如果做不了优秀的团队,那么就做一个典型的团队,公司需要这么一个神话,需要这么一个领头羊. 我在进入某公司后,第一个项目用的是"敏捷开发方法".而公司的理念恰恰是:开发.协作性强.扁 ...

  7. Ext JS4百强应用: 用grid.plugin.CellEditing做高级查询 --第10强

    Ext JS4,用grid.plugin.CellEditing做高级查询: 写了90%,界面出来了,小兴奋就贴出来,还有细节要调整,基本能用. 代码: Ext.define('chenghao.ad ...

  8. 管道函数(pipelined function)简单使用示例

    -----------------------------Cryking原创------------------------------ -----------------------转载请注明出处, ...

  9. 从ICassFactory为CLSID为{17BCA6E8-A950-497E-B2F9-AF6AA475916F}的COM组件创建实例失败,原因是出现以下错误:c001f011.(Microsoft.Server.manageDTS

    从ICassFactory为CLSID为{17BCA6E8-A950-497E-B2F9-AF6AA475916F}的COM组件创建实例失败,原因是出现以下错误:c001f011.(Microsoft ...

  10. Maven 插件 maven-tomcat7-plugin - 常用命令及配置

    常用命令 tomcat7:deploy 说明:部署 WAR 到 Tomcat tomcat7:help 说明:查看插件帮助信息 tomcat7:run 说明:支行当前项目 配置 <project ...