一、线程生命周期和转换
![image](https://note.youdao.com/yws/api/personal/file/505DB1E1B7ED4D589CFE3C5B5956E6E6?method=download&shareKey=6635204776a27486da53a72dbcc57a45)
运行态->就绪态:
1.yeild让出CPU时间 -- 不释放锁
2.时间片轮转到期
就绪态->运行态:
1.获取到CPU时间片
2.join()线程排队
运行态->阻塞态:
1.sleep() -- 不释放锁
2.wait() -- 释放锁
阻塞态->就绪态:
1.sleep到期或者被打断
2.阻塞被唤醒
二、线程相关和API
- yield:使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。cpu会从众多的可执行态里选择,刚刚的线程还是有可能会被再次执行。用了yield方法后,该线程就会把CPU时间让掉,让其他或者自己的线程执行(也就是谁先抢到谁执行)。
- join:在A线程内调用thread.join(),相当于将A排队在thread线程的后面
三、线程优先级
- 线程优先级:t2.setPriority()部分操作系统会忽略优先级,优先级高不保证更多的执行机会,值为1-10。不能将次作为执行的保证。
- 守护线程:t2.setDaemon(true);没有非守护线程执行时,守护线程都会退出,做一些资源回收,资源调度之类,守护线程的finally语句不能保证执行,关键的清理逻辑不能交给守护线程的finally语句块来完成。
public class DaemonThread {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new MyThread();
t1.setDaemon(true);
t1.start();
Thread.sleep(5 * 1000);
}
private static class MyThread extends Thread {
@Override
public void run() {
try {
while (true) {
Thread.sleep(1000);
System.out.println("线程" + Thread.currentThread().getName() + "执行...");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("守护线程的finally代码块....");
}
}
}
}