线程的状态和启停

本文介绍了Java中线程的六种状态,包括new、runnable、terminated、blocked、waiting和timed_waiting,并详细解析了状态转换。此外,讨论了线程的启动,指出start方法实际上调用了run方法的native实现。对于线程的停止,文章建议使用interrupt方法,避免使用已废弃的suspend和stop方法,以确保资源的及时释放和系统稳定性。

线程的状态和启停

状态

线程的状态分别为:

new

在新建后的线程,状态就会变成new,比如

new Thread(()->{
	System.out.println("i am print");
});

//或者实现runnable接口,其实Thread就实现了runnable接口

runnable

当调用了线程的.start()方法时,就处于待执行的状态

terminate

当线程执行完毕后,处于终止状态,可以根据

Thread.currentThread().isAlive()

来判断线程是否存活

blocked

当线程存在锁竞争时,被阻塞的线程就会处于blocked状态。测试代码如下

new Thread(()->{
            synchronized (ThreadStateDemo.class){
                try {
                    TimeUnit.SECONDS.sleep(100);


                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"getSyn1").start();

        new Thread(()->{
            synchronized ((ThreadStateDemo.class)){
                try{
                    System.out.println("123");
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        },"blockthread1").start();

在控制台调用jps获取到当前运行的pid后,调用jstack指令,可以看到线程目前的状态,代码中给线程命名是为了在调用jstack指令时,明确知道是哪个线程处于何种状态。

waiting

顾名思义,处于该状态即通过调用wait方法

 new Thread(()->{
            try {
                ThreadStateDemo.class.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

time_waiting

有时间限制的等待,可以通过sleep和wait(mills)方法。

启停

启动线程我们都是用start方法,但是为啥我们复写的是run方法?

在java源代码中,调用start方法的底层使用的是native方法,通过观察native方法的源码发现,启动方法调用的是run方法。

关于线程的停止,api里面有suspend、stop、interrupt、抛异常等方法,但是suspend和stop是被设置成失效方法的,因为这种停止会让线程无法及时的释放资源从而导致工作状态的不稳定。一般我们使用的都是interrupt方法,其实现原理是在run方法设计中,通过一个标志位来确定是否执行run方法体,然后通过另外的条件出发把标志位设置成false。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值