线程的优先级、等待线程、守护线程
我们可以通过 public final void setPriority(int newPriority)
来设置线程的优先级,但是优先级并不是绝对的,只是相对来说比其他的线程得到CPU的资源机会多一些。
一个线程的优先级设置遵从以下原则:
线程创建时,子继承父的优先级。
线程创建后,可通过调用setPriority()方法改变优先级。
线程的优先级是1-10之间的正整数,线程优先级最高为10,最低为1,默认为5。
1- MIN_PRIORITY
10-MAX_PRIORITY
5-NORM_PRIORITY
无时间片轮循机制时,高级别的线程优先执行,如果低级别的线程正在运行时,有高级别线程可运行状态,则会执行完低级别线程,再去执行高级别线程。
如果低级别线程处于等待、睡眠、阻塞状态,或者调用yield()函数让当前运行线程回到可运行状态,以允许具有相同优先级或者高级别的其他线程获得运行机会。
因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。结论:yield()从未导致线程转到等待/睡眠/阻塞状态。
在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
代码示例:
package demo4;
public class MyThread extends Thread{
//给线程定个变量,取个名字
private String name;
public MyThread(String name){
this.name = name;
}
/* 线程的执行逻辑体 */
@Override
public void run(){
for (int i = 0; i <= 100; i++) {
System.out.println(name+"下载了:"+i+"%");
}
}
}
package demo4;
public class ThreadTest {
public static void main(String[] args) {
//创建一个线程的对象
MyThread mt = new MyThread("极品飞车14");
//创建一个线程的对象
MyThread my = new MyThread("GTA5");
//启动线程
//创建一个优先级
my.setPriority(Thread.MAX_PRIORITY);//最高优先级 最大值10
//mt.setPriority(Thread.MIN_PRIORITY);//最低优先级 最小值1
//mt.setPriority(Thread.NORM_PRIORITY);//分配给线程默认的优先级 普通值 5
mt.start();//开启线程
my.start();//开启线程
//System.out.println("下载结束");
}
}
线程的优先执行
让一个线程优先执行:使用join()
注意:
使用join会报异常
加入线程必须要在先执行的线程的start()下面来执行。
package demo4;
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
//创建线程的对象
MyThread mt = new MyThread("极品飞车14");
MyThread my = new MyThread("GTA5");
MyThread mx = new MyThread("地平线4");
mt.start();//开启线程
my.start();//开启线程
//加入线程必须要在先执行的线程的start()下面来执行。
my.join();
mx.start();//开启线程
//System.out.println("下载结束");
}
}
等待线程(让出线程)
yield():暂停当前正在执行的线程对象,并执行其他线程。
当前的线程从运行阶段回到就绪阶段,目的是吧cpu的资源让给其他的线程。
package demo5;
public class MyThread extends Thread{
//给线程定个变量,取个名字
private String name;
public MyThread(String name){
this.name = name;
}
/* 线程的执行逻辑体 */
@Override
public void run(){
for (int i = 0; i <= 100; i++) {
System.out.println(name+"下载了:"+i+"%");
//让出线程,谁先抢到CPU算谁的
Thread.yield();
}
}
}
package demo5;
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
//创建线程的对象
MyThread mt = new MyThread("极品飞车14");
MyThread my = new MyThread("GTA5");
MyThread mx = new MyThread("地平线4");
mt.start();//开启线程
my.start();//开启线程
mx.start();//开启线程
}
}
守护线程
setDaemon():将该线程标记为守护线程或用户线程
守护线程会随着主线程的结束而结束。
package demo5;
public class MyThread extends Thread{
//给线程定个变量,取个名字
private String name;
public MyThread(String name){
this.name = name;
}
/* 线程的执行逻辑体 */
@Override
public void run(){
for (int i = 0; i <= 100; i++) {
System.out.println(name+"下载了:"+i+"%");
//让出线程,谁先抢到CPU算谁的
}
}
}
package demo5;
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
//创建线程的对象
MyThread mt = new MyThread("极品飞车14");
//设置守护线程
mt.setDaemon(true);
mt.start();//开启线程
System.out.println("主线程结束");
}
}package demo5;
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
//创建线程的对象
MyThread mt = new MyThread("极品飞车14");
//设置守护线程
mt.setDaemon(true);
mt.start();//开启线程
System.out.println("主线程结束");
}
}