栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

线程状态

创建状态
线程对象创建就进入了创建状态
就绪状态
调用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("上帝保佑着你");
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/710095.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号