Java基础——线程调度
2022/4/13 20:12:53
本文主要是介绍Java基础——线程调度,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、线程的两种调度模型:
1.分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
2.抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一点(Java使用的就是抢占式调度模型)
为什么说抢占式调度模型多线程的执行具有随机性?
假设某台计算机只有一个CPU,那么CPU在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权才能执行指令,所以多线程程序执行是具有随机性的,因为不确定谁可以抢到CPU的使用权
二、Thread类中设置和获取线程优先级的方法
设置优先级:public final void setPriority(int newpriority):更改此线程优先级
获取线程优先级:public final int getPriority():返回此线程的优先级
//优先级从1-10,数字越大,优先级越高 //优先级从1-10,数字越大,优先级越高 //线程默认的优先级是5,范围是1-10 //优先级越高只是代表获得CPU时间片的几率高,并不能确保优先级高的线程全部领先完成
public class MyThreadDemo { public static void main(String[] args) { MyThread mt=new MyThread("兔子"); MyThread mt1=new MyThread("乌龟"); //public final int getPriority():返回此线程的优先级 // System.out.println(mt.getPriority()); // System.out.println(mt.getPriority()); //public final void setPriority(int newpriority):更改此线程优先级 mt.setPriority(10);//优先级从1-10,数字越大,优先级越高 mt.setPriority(1);//优先级从1-10,数字越大,优先级越高 //优先级越高只是代表获得CPU时间片的几率高,并不能确保优先级高的线程全部领先完成 mt.start(); mt1.start(); } }
三、线程控制
方法名 | 说明 |
---|---|
static void sleep(long millis) | 使得当前正在执行的线程停留(暂停执行)所设置的毫秒数 |
void join() | 等待这个线程的死亡 |
void setDaemon(boolean on) | 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出 |
sleep方法代码
public class ThreadSleep extends Thread { //无参,带参构造 public ThreadSleep(){} public ThreadSleep(String name){ super(name ); } //重写run方法 @Override public void run() { for (int i=0;i<100;i++){ //使用getName()获取线程名称 System.out.println(getName()+":"+i); //让线程每次执行完毕就休眠1000毫秒 try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
/* * static void sleep(long millis)使得当前正在执行的线程停留(暂停执行)所设置的毫秒数*/ public class ThreadSleepDemo { public static void main(String[] args) { MyThread mt=new MyThread("张三"); MyThread mt1=new MyThread("李四"); MyThread mt2=new MyThread("王五"); mt.start(); mt1.start(); mt2.start(); } }
join方法:
作用:可以让某一个线程执行完毕后再开始其他线程
public class ThreadJoin extends Thread{ //无参,带参构造 public ThreadJoin(){} public ThreadJoin(String name){ super(name ); } //重写run方法 @Override public void run() { for (int i=0;i<100;i++){ //使用getName()获取线程名称 System.out.println(getName()+":"+i); } } }
public class ThreadJoinDemo { public static void main(String[] args) { MyThread mt=new MyThread("张三"); MyThread mt1=new MyThread("李四"); MyThread mt2=new MyThread("王五"); mt.start(); try { mt.join(); } catch (InterruptedException e) { e.printStackTrace(); } mt1.start(); mt2.start(); } }
void setDaemon(boolean on) 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出
简单来说比如有三个线程,一个主线程名字为爹,两个线程名字为儿子,当把两个儿子线程设置为守护线程后,当爹线程完成了任务消失后,两个儿子线程不管执行到了哪里会直接消失
public class ThreadDaemon extends Thread{ //无参,带参构造 public ThreadDaemon(){} public ThreadDaemon(String name){ super(name ); } //重写run方法 @Override public void run() { for (int i=0;i<100;i++){ //使用getName()获取线程名称 System.out.println(getName()+":"+i); } } }
public class ThreadDaemDemo { public static void main(String[] args) { MyThread mt = new MyThread("儿子一"); MyThread mt1 = new MyThread("儿子二"); //设置一个主线程 Thread.currentThread().setName("爹"); //设置两个守护线程 mt.setDaemon(true); mt1.setDaemon(true); mt.start(); mt1.start(); //设置主线程需要执行的步骤 for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "," + i); } } }
四、线程的生命周期
这篇关于Java基础——线程调度的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?