线程的优先级 :
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线程

线程类的常用方法:

  1. 类方法
  2. 实例方法

Java线程的调度(线程的优先级、线程睡眠、线程让步、线程插队)相关推荐

  1. 操作系统4小时速成:进程管理占考试40%,进程状态,组织,通信,线程拥有调度,进程拥有资源,进程和线程的区别

    操作系统4小时速成:进程管理占考试40%,进程状态,组织,通信,线程拥有调度,进程拥有资源,进程和线程的区别 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去 ...

  2. Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)

    7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...

  3. 线程调度 java_Java多线程--线程的调度

    java虚拟机会按照特定的机制为程序中的每个线程分配CPU的使用权,这种机制被称为线程的调度. 在计算机中,线程调度有两种模型,分别是分时调度模型和抢占式调度模型. 分时调度模型: 指让所有的线程轮流 ...

  4. c语言中线程的调度,线程、进程及其调度简介

    知识需要不断总结.验证.迭代,知其然,知其所以然. 1.进程和线程 进程和线程的区别与联系: 进程:资源申请的最小单位 线程:资源调度的最小单位,进程的一部分,描述指令流的执行状态. 内核中,描述进程 ...

  5. java线程 cpu占用率_多线程程序 怎样查看每个线程的cpu占用

    可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的 ...

  6. Java线程:线程的调度-优先级

    http://lavasoft.blog.51cto.com/62575/221801 Java线程:线程的调度-优先级 与线程休眠类似,线程的优先级仍然无法保障线程的执行次序.只不过,优先级高的线程 ...

  7. Java线程的调度及线程的优先级

    调度策略 Java的调度方法 同优先级线程组成先进先出队列(先到先服务),使用时间片策略. 对高优先级,使用优先调度的抢占式策略. 线程的优先级等级 Thread.MAX_PRIORITY:10 Th ...

  8. java多线程 修改优先级_Java多线程-线程的调度(优先级)

    与线程休眠类似,线程的优先级仍然无法保障线程的执行次序.只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行. 线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优先 ...

  9. java 线程亲缘性_线程的调度、优先级和亲缘性

    每隔20ms左右,Windows要查看当前存在的所有线程内核对象.在这些对象中,只有某些对象被视为可以调度的对象.Windows选择可调度的线程内核对象中的一个,将它加载到CPU的寄存器中,它的值是上 ...

最新文章

  1. Java多线程:类ThreadPoolExecutor详解
  2. Python 3.x 引入了函数注释
  3. Linux 跟踪进程对CPU的占用情况,对内存的占用情况
  4. const成员函数、const类对象、mutable数据成员
  5. 用tqdm可视化loop过程
  6. 商务统计_13 使用excel拟合曲趋势线
  7. 现代操作系统 第六章 死锁 习题答案
  8. Linux下pgadmin4启动报错,在CentOS 7/Fedora 29系统上安装配置pgAdmin 4的方法
  9. Linux下载神器XDM
  10. opencv下载百度网盘链接及安装
  11. 163邮箱手机收件服务器设置,网易邮箱全面默认开通IMAP 手机收信提速10倍
  12. Zynq-7010/7020开发板(双核ARM Cortex-A9+A7)软硬件规格资料
  13. psycopg2几个小坑
  14. 用51单片机驱动蜂鸣器
  15. 傻瓜式视频转换软件FormatFactory(格式工厂)
  16. 闭关宅家学点啥?第1弹:做个启动U盘吧
  17. <童年>吉他弹唱,大家PP
  18. 异构系统架构标准——HSA
  19. Logstash的简单使用
  20. 5G应用场景300例 附下载地址

热门文章

  1. linux安装socket.io,Socket.IO
  2. 什么是显热?什么是潜热?
  3. 7-10 计算多门课的平均绩点
  4. 卡巴斯基文件服务器,卡巴斯基测试反病毒Linux文件服务器6.0
  5. Unknown database ‘ ‘
  6. 项目管理--统筹兼顾
  7. linux系统重启网卡命令
  8. 满足条件的数累加(YZOJ-1066)
  9. 关于java输入方式的一些浅薄的理解
  10. mybatis关系映射之一对多和多对一