一、线程的两种调度模型:
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);
}
}
}
四、线程的生命周期
来源:https://www.cnblogs.com/CYan521/p/16141638.html
本站部分图文来源于网络,如有侵权请联系删除。