多线程学习一:java线程状态转换

前言

大家好,我是李小墨,be foolish,be hungry。本篇文章主要写java线程状态转换,欢迎大家多多斧正,如果觉得小墨我写得用心的话,可以点个赞啊。

主要讲述java线程状态转换,参入使用少量代码

一,线程6种状态

1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。 线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
3. 阻塞(BLOCKED):表示线程阻塞于锁。
4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
5. 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
6. 终止(TERMINATED):表示该线程已经执行完毕。 状态都定义在Thread类的State枚举类中

这些都可以在Thread类的State状态获得

二,线程状态图

在这里插入图片描述
简单一点的理解线程的生命周期
在这里插入图片描述

三,线程状态控制

挂起和睡眠是主动的,挂起恢复需要主动完成,睡眠恢复则是自动完成的,因为睡眠有一个睡眠时间,睡眠时间到则恢复到就绪态。
而阻塞是被动的,是在等待某种事件或者资源的表现,一旦获得所需资源或者事件信息就自动回到就绪态。

1,启动线程
注意启动线程时处于就绪状态,还得等到有资源时再执行
实现并启动线程有两种方法
1、写一个类继承自Thread类,重写run方法。用start方法启动线程
2、写一个类实现Runnable接口,实现run方法。用new Thread(Runnabletarget).start()方法来启动

2,线程停止
void interrupt() Thread.interrupted()
推荐:Thread.interrupt()
严禁:Thread.stop() suspend() resume()
线程停止时我们需要把状态,资源释放出来给其他线程,所以要让线程停止时不能暴力停止,否则如果占住锁的话,会导致死锁等情况,只能去跟线程打招呼建议其停止,让线程去自己判断,线程调用isInterrupted()是否为true,这时我们再去释放锁,资源。
注意:建议代码如果要考虑线程中断情况得先做isInterrupted判断

四,代码讲解

1,Thread.yield()方法
调用该方法会释放轮到该线程占用的时间片,使当前线程处于就绪状态,然后和其他线程重新争夺时间片

2,Thread.join()
当我们使用A线程对象调用此方法时,它会暂停调用A线程的执行,直到被调用的对象B完成其执行,代码比较简单,我们可以深入源码了解下:

当在当前线程A通过调用B线程的isAlive方法判断B线程任然运行,则调用wait(Object 提供的方法),等待B线程执行完唤醒

public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值