02-Java多线程、线程生命周期更多细节

一、线程生命周期和转换

image

运行态->就绪态:
	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代码块....");
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值