线程的五大状态和线程 *** 作

线程的五大状态和线程 *** 作,第1张

线程的五大状态线程 *** 作 线程状态

创建状态
线程对象创建就进入了创建状态
就绪状态
调用start(),线程进入就绪状态,但还没有具体执行
运行状态
执行线程体的代码块时,线程处于运行状态
阻塞状态
当调用sleep()等方法时,线程进入阻塞状态,线程暂时不执行,等阻塞事件解除后再执行
死亡状态
线程结束进入死亡状态,进入死亡状态后的线程不能再启动

其转换关系如下图

线程状态观测

Thread.State = NEW
已经创建但尚未启动的线程处于此状态
Thread.State = RUNNABLE
正在Java虚拟机中执行的线程处于此状态
Thread.State = BLOCKED
被阻塞等待监视器锁定的线程处于此状态
Thread.State = WAITING
正在等待另一个线程执行特定动作的线程处于此状态
Thread.State = TIMED_WAITING
正在等待另一个线程执行动作经过指定等待时间的线程处于此状态
Thread.State = TERMINATED
已经退出的线程处于此状态,已退出的线程不能再启动

线程停止

建议让线程在循环结束时自己停止,不要用stop()和destroy()

线程休眠 sleep()

sleep(时间) 指定当前线程阻塞的毫秒数sleep() 存在异常InterruptedException,需要抛出每个对象都有一个锁,sleep不会释放锁 线程礼让 yield()

线程礼让使已经在执行的线程暂停(但不阻塞),然后从运行状态转为就绪状态,让CPU重新调度

public class DemoYield {
    public static void main(String[] args) {
        Yield yield = new Yield();
        new Thread(yield,"a").start();
        new Thread(yield,"b").start();
    }
}

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

这是因为线程礼让不一定让另一个线程先执行,因为礼让后两个线程同为就绪状态,先执行哪个要看CPU脸色

线程强制执行 join()

可以暂停正在执行的线程,让另一个线程插队先执行完毕,然后原来的进程再继续执行

public class DemoJoin {
    public static void main(String[] args) {
        Common common = new Common();
        new Thread(common).start();
    }
}

class Common implements Runnable{
    Vip vip = new Vip();
    Thread thread = new Thread(vip);
    @Override
    public void run() {
        for (int i = 0; i < 500; i++) {
            if (i==200){
                try {
                    thread.start();
                    thread.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("普通线程执行—----"+i);
        }
    }
}


守护线程 daemon

线程分为用户线程和守护线程

用户线程就是普通的线程,需要手动让它停下来,虚拟机必须确保用户线程执行完毕

而虚拟机不用等待守护线程执行完毕,用户线程执行完了虚拟机就关闭,守护线程自然也停止了

public class DemoDaemon {
    public static void main(String[] args) {
        Person you = new Person();
        God god = new God();
        Thread godThread = new Thread(god);
        godThread.setDaemon(true);	//将上帝保佑设为守护线程
        godThread.start();
        Thread personThread = new Thread(you);
        personThread.start();
    }
}

class Person implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 30000; i++) {
            System.out.println("开心地活了 "+i+" 天");
        }
    }
}

class God implements Runnable {
    @Override
    public void run() {
        while (true){	//守护线程无限循环也没关系
            System.out.println("上帝保佑着你");
        }
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5708634.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存