【JAVA多线程】线程状态

本文介绍了Java线程的六种状态,包括New、Runable、Blocked、Waited、Timed_waiting和Terminated,并强调了避免使用stop()和destroy()来停止线程,建议使用标志位。示例代码展示了如何通过标志位优雅地停止线程,以及线程休眠和礼让的概念与用法。线程休眠不会释放锁,而礼让线程并不保证成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程状态

Java线程状态

 New    尚未启动的线程 处于此状态

Runable  在java虚拟机中执行的线程 处于此状态

Blocked  被阻塞等待监视器锁定的线程 处于此状态

Waited  正在等待另一个线程执行特定动作的线程 处于此状态

Timed_waiting  正在等待另一个线程执行动作到达指定等待时间的线程 处于此状态

Terminated  已退出的线程  处于此状态

线程停止方法最好不要用stop() ,destroy():


/**
 *
 *  1. 建议线程正常停止 --> 不建议死循环
 *  2. 建议使用标志位 --> 设置一个flag变量
 *  3. 不要使用stop或destroy等过时方法
 */


public class StopThread implements Runnable{
    // 设置一个标志位
    private  boolean flag = true;

    @Override
    public void run() {
        int i = 0;
        while(flag){
            System.out.println("run...Thread"+ i++);
        }
    }

    // 设置一个公开的方法停止线程,转换标志位
    public void stop(){
        this.flag = false;
    }

    public static void main(String[] args) {
        StopThread stopThread = new StopThread();
        new Thread(stopThread).start();

        for(int i = 0; i < 100; i++){
            System.out.println("main"+i);
            if(i == 90){
                // 调用stop方法切换标志位让线程停止
                stopThread.stop(); // 这里只是停止了子线程
                System.out.println("Thread has stopped");
            }
        }
    }
}

线程休眠

(1) sleep(tine) 指定当前线程阻塞的毫秒数;

(2) sleep存在异常InterruptedException;

(3) sleep时间到达后,线程进入就绪状态;

(4) 每个对象都有一个锁,sleep不会释放锁

public class SleepThread implements Runnable{
    // 票数
    private int ticketNums = 10;

    @Override
    public void run() {
        while (true){
            if(ticketNums<=0){
                break;
            }
            // 模拟网络延迟,发现线程安全问题
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // Thread.currentThread().getName 获得当前执行线程的名字
            System.out.println(Thread.currentThread().getName()+"-->拿到了"+ ticketNums--+"票");
        }
    }

    public static void main(String[] args){
        SleepThread ticket = new SleepThread();

        new Thread(ticket,"xiaoming").start();
        new Thread(ticket,"teacher").start();
        new Thread(ticket,"huangniu").start();
    }
}

线程礼让

(1)让当前正在执行的线程暂停,但不阻塞;

(2)将线程从运行状态转为就绪状态;

(3)让cpu重新调度,,礼让不一定成功;

// 测试礼让线程, 不一定成功
public class YieldThread {
    public static void main(String[] args) {
        MyYield myYield = new MyYield();
        new Thread(myYield, "a").start();
        new Thread(myYield,"b").start();
    }
}

class MyYield implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"线程开始执行");
        Thread.yield(); // 礼让
        System.out.println(Thread.currentThread().getName()+"线程停止执行");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值