Java线程的调度(线程的优先级、线程睡眠、线程让步、线程插队)
线程的优先级 :
Java语言中线程有优先级,优先级高的线程会获得较多的运行机会。 当程序中有多个线程存在的时候,线程和线程之间的关系并非是平等的。
Java语言中线程的优先级用整数表示,取值范围是1~10,Thread类由以下三个静态常量表示线程的优先级。
(1)static int MAX_PRIORITY
线程可以具有的最高优先级,取值为10。
(2)static int MIN_PRIORITY
线程可以具有的最低优先级,取值为1。
(3)static int NORM_PRIORITY
分配给线程的默认优先级,取值为5。
Thread类的方法setPriority()和getPriority()分别用来设置和获取线程的优先级。
package thread;public class _5_线程的优先级 {public static void main(String[] args) {MySleeps ms = new MySleeps();Thread t1 = new Thread(ms,"a");Thread t2 = new Thread(ms,"b");Thread t3 = new Thread(ms,"c");System.out.println(t1.getPriority());//默认的优先级为普通的优先级——5t1.setPriority(Thread.MAX_PRIORITY);//最大——10t3.setPriority(Thread.MIN_PRIORITY);//最小——1t1.start();t2.start();t3.start();
}
}class MySleeps implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubfor(int i=0 ; i<40 ; i++) {System.out.println(Thread.currentThread().getName()+" "+i);}}}
由上图的运行结果可以知道,优先级高的可以获得更多的机会优先执行。
Java中虽然提供了10个线程优先级,但是这需要电脑操作系统的支持,不同操作系统对优先级的支持是不一样的,不能很好的和Java中线程优先级一一对应。
因此,在设计多线程应用程序的时候,其功能的实现一定不能依赖于线程的优先级,而只能将线程的优先级作为一种提高程序效率的手段。
线程睡眠:
方法Thread.sleep(long millis),使线程转到阻塞状态。millis参数设定睡眠的时间,以ms为单位。当睡眠结束后,就转为就绪(Runnable)状态。
当睡眠时间到期,则返回到可运行状态。
睡眠的位置:为了让其他线程有机会执行,可以将Thread.sleep()的调用放线程run()之内。这样才能保证该线程执行过程中会睡眠。
sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始执行。
package thread;public class _6_Sleep线程睡眠 {public static void main(String[] args) {MySleep ms = new MySleep();Thread t1 = new Thread(ms,"a");Thread t2 = new Thread(ms,"b");Thread t3 = new Thread(ms,"c");t1.start();t2.start();t3.start();
}
}class MySleep implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubfor(int i=0 ; i<40 ; i++) {System.out.println(Thread.currentThread().getName()+" "+i);if(i==6)try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
在结果中可以看出,当i==6的时候,该线程就会进入短暂的睡眠,而进行下一个线程的运行(也有可能进入睡眠后又醒了继续抢夺cpu,继续进行该线程,就是几率有点小)
线程让步:
方法Thread.yield(),暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。
package thread;public class _7_yield线程让步 {public static void main(String[] args) {//创建两个线程Thread t1 = new YieldThread("one");Thread t2 = new YieldThread("two");//开启两个线程t1.start();t2.start();}
}class YieldThread extends Thread{public YieldThread(String name) {super(name);}public void run() {for(int i = 0 ; i < 5 ; i++) {System.out.println(Thread.currentThread().getName()+" "+i);if(i==2) {System.out.println("线程让步");Thread.yield();}}}
}
该方法与sleep(参数)方法类似,都可以让当前正在运行的线程暂停,区别在于yield()方法不会阻塞该线程,它只是将线程转换为就绪状态,让系统的调度器重新调度一次。当某个线程调用yield()方法后,与当前线程优先级相同或者更高的线程可以获得执行的机会。
由于Java虚拟机默认采用抢占式调度模式,所有线程都会再次抢占CPU资源抢夺权,所以执行线程让步后不能保证立即执行其他线程。
线程插队(加入):
方法join(),等待这个线程执行结束。在当前线程中调用另一个线程的方法join(),则当前线程转入阻塞状态,直到另一个线程运行结束,当前线程再由阻塞转为就绪状态。
package thread;public class _8_join线程插队 {public static void main(String[] args) {MyJoin mj = new MyJoin();Thread t = new Thread(mj,"one");t.start();for(int i = 0 ; i <40;i++) {System.out.println("main "+i);if(i==20)//加入的线程先运行完再运行主线程try {t.join();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}class MyJoin implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubfor(int i = 0 ; i <40;i++) {System.out.println(Thread.currentThread().getName()+" "+i);}}}
可以看出,当main=20的时候,进行了插队,当one线程全部结束的时候才继续进行main线程
线程类的常用方法:
- 类方法
- 实例方法
Java线程的调度(线程的优先级、线程睡眠、线程让步、线程插队)相关推荐
- 操作系统4小时速成:进程管理占考试40%,进程状态,组织,通信,线程拥有调度,进程拥有资源,进程和线程的区别
操作系统4小时速成:进程管理占考试40%,进程状态,组织,通信,线程拥有调度,进程拥有资源,进程和线程的区别 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去 ...
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)
7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...
- 线程调度 java_Java多线程--线程的调度
java虚拟机会按照特定的机制为程序中的每个线程分配CPU的使用权,这种机制被称为线程的调度. 在计算机中,线程调度有两种模型,分别是分时调度模型和抢占式调度模型. 分时调度模型: 指让所有的线程轮流 ...
- c语言中线程的调度,线程、进程及其调度简介
知识需要不断总结.验证.迭代,知其然,知其所以然. 1.进程和线程 进程和线程的区别与联系: 进程:资源申请的最小单位 线程:资源调度的最小单位,进程的一部分,描述指令流的执行状态. 内核中,描述进程 ...
- java线程 cpu占用率_多线程程序 怎样查看每个线程的cpu占用
可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的 ...
- Java线程:线程的调度-优先级
http://lavasoft.blog.51cto.com/62575/221801 Java线程:线程的调度-优先级 与线程休眠类似,线程的优先级仍然无法保障线程的执行次序.只不过,优先级高的线程 ...
- Java线程的调度及线程的优先级
调度策略 Java的调度方法 同优先级线程组成先进先出队列(先到先服务),使用时间片策略. 对高优先级,使用优先调度的抢占式策略. 线程的优先级等级 Thread.MAX_PRIORITY:10 Th ...
- java多线程 修改优先级_Java多线程-线程的调度(优先级)
与线程休眠类似,线程的优先级仍然无法保障线程的执行次序.只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行. 线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优先 ...
- java 线程亲缘性_线程的调度、优先级和亲缘性
每隔20ms左右,Windows要查看当前存在的所有线程内核对象.在这些对象中,只有某些对象被视为可以调度的对象.Windows选择可调度的线程内核对象中的一个,将它加载到CPU的寄存器中,它的值是上 ...
最新文章
- Java多线程:类ThreadPoolExecutor详解
- Python 3.x 引入了函数注释
- Linux 跟踪进程对CPU的占用情况,对内存的占用情况
- const成员函数、const类对象、mutable数据成员
- 用tqdm可视化loop过程
- 商务统计_13 使用excel拟合曲趋势线
- 现代操作系统 第六章 死锁 习题答案
- Linux下pgadmin4启动报错,在CentOS 7/Fedora 29系统上安装配置pgAdmin 4的方法
- Linux下载神器XDM
- opencv下载百度网盘链接及安装
- 163邮箱手机收件服务器设置,网易邮箱全面默认开通IMAP 手机收信提速10倍
- Zynq-7010/7020开发板(双核ARM Cortex-A9+A7)软硬件规格资料
- psycopg2几个小坑
- 用51单片机驱动蜂鸣器
- 傻瓜式视频转换软件FormatFactory(格式工厂)
- 闭关宅家学点啥?第1弹:做个启动U盘吧
- <童年>吉他弹唱,大家PP
- 异构系统架构标准——HSA
- Logstash的简单使用
- 5G应用场景300例 附下载地址