千家信息网

Java多线程中线程状态有哪些

发表于:2024-10-03 作者:千家信息网编辑
千家信息网最后更新 2024年10月03日,这篇文章主要为大家展示了"Java多线程中线程状态有哪些",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java多线程中线程状态有哪些"这篇文章吧。线程状态
千家信息网最后更新 2024年10月03日Java多线程中线程状态有哪些

这篇文章主要为大家展示了"Java多线程中线程状态有哪些",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java多线程中线程状态有哪些"这篇文章吧。

    线程状态

    五个状态新生就绪运行死亡阻塞


    停止线程

    • 不推荐使用JDK提供的stop()、destroy()方法【已弃用】

    • 推荐线程自己停止

    • 建议用一个标志位进行终止变量,到flag=false,则终止线程运行

    public class StopDemo implements Runnable {    // 设置一个标志位    boolean flag = true;    @Override    public void run() {        // 线程体使用该标志        while (flag) {            System.out.println("runing....");        }    }    // 设置一个公共的方法停止线程,转换标志位    public void stop() {        this.flag = false;    }}

    线程休眠

    • sleep(时间)指定当前线程阻塞的毫秒数

    • sleep存在异常 Interrupted Exception

    • sleep时间达到后线程进入就绪状态

    • sleep可以模拟网络延时,倒计时等

    • 每一个对象都有一个锁,sleep不会释放锁(重点记下)

    模拟网络延迟(放大问题的发生性)

    抢票:

    public class SleepDemo implements Runnable {    // 票数    private int tickeNum = 10;    @Override    public void run() {        while (true) {            if (tickeNum <= 0) {                break;            }            try {                Thread.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(String.format("%s --> 拿到了第%d张票", Thread.currentThread().getName(), tickeNum--));        }    }    public static void main(String[] args) {        SleepDemo sleepDemo = new SleepDemo();        new Thread(sleepDemo, "张三").start();        new Thread(sleepDemo, "李四").start();        new Thread(sleepDemo, "王五").start();    }}

    从输出结果看,第4张票被多个人抢到了,产生了线程安全问题

    模拟计时

    public class SleepDemo2 {    // 模拟倒计时    public static void countDown() {        int num = 5;        while (true) {            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")));            num--;            if (num==0) {                break;            }        }    }    public static void main(String[] args) {        countDown();    }}

    线程礼让

    • 礼让线程,让当前正在执行的线程暂停,但不阻塞

    • 将线程从运行状态转为就绪状态

    • 让CPU重新调度,礼让不一定成功!看CPU心情

    public class YieldDemo {    public static void main(String[] args) {        MyYeild myYeild = new MyYeild();        new Thread(myYeild, "a").start();        new Thread(myYeild, "b").start();    }}class MyYeild implements Runnable {    @Override    public void run() {        System.out.println(Thread.currentThread().getName() + " 线程开始");        // 礼让        Thread.yield();        System.out.println(Thread.currentThread().getName() + " 线程停止");    }}

    如果a线程礼让成功了,就会让b线程先跑

    插队(线程强制执行)

    • Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞

    • 可以想象成食堂插队打饭。会让线程阻塞,慎用。

    public class JoinDemo implements Runnable {    @Override    public void run() {        for (int i = 0; i < 1000; i++) {            System.out.println("vip来了" + i);        }    }    public static void main(String[] args) throws InterruptedException {        JoinDemo joinDemo = new JoinDemo();        Thread thread = new Thread(joinDemo);        thread.start();        // 主线程        for (int i = 0; i < 500; i++) {            if (i == 200) {                // 插队                thread.join();            }            System.out.println("main" + i);        }    }}

    在主线程中的i=100的时候,vip线程进来插队,直到vip执行完,主线程才继续

    线程状态观测

    通过一个枚举常量:Thread.State

    public class StateDemo {    public static void main(String[] args) throws InterruptedException {        Thread thread = new Thread(() -> {            for (int i = 0; i < 5; i++) {                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println("===========");            }        });        // 观察状态  new        System.out.println(thread.getState());        // 启动后   run        thread.start();        System.out.println(thread.getState());        // 只要线程不终止,就一直输出状态        while (thread.getState() != Thread.State.TERMINATED) {            Thread.sleep(500);            System.out.println(thread.getState());        }    }}

    线程优先级

    • Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行

    • 线程的优先级用数字表示,范围从1~10

      • Thread.MIN PRIORITY = 1;

      • Thread.MAX PRIORITY = 10;

      • Thread.NORM PRIORITY = 5;

    • 使用以下方式改变或获取优先级

      • getPriority()、setPriority(int xxx)

    不一定线程优先级高的会先跑,优先级低也只是意味着获得调度的概率低,并不是优先级低就不会被调用了,主要还是取决于CPU调度,有可能会出现性能倒置。

    守护线程

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

    虚拟机必须确保用户线程执行完毕

    虚拟机不用等待守护线程执行完毕

    如,后台记录操作日志,监控内存,垃圾回收,一些等待机制等等

    以上是"Java多线程中线程状态有哪些"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

    线程 状态 优先级 调度 阻塞 标志 内容 篇文章 运行 成功 倒计时 方法 时间 用户 网络 问题 学习 帮助 推荐 监控 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 郑州计算机软件开发哪家正规 黄山医院软件开发要多少钱 宝丽软件开发 中国学位论文数据库全文格式 山东省管理软件开发公司有哪些 电商软件开发方案 门头沟区管理软件开发介绍 澳大利亚社会科学数据库 信佑2010管理服务器 网络安全大会2021时间长沙 数据库技术主要应用岗位 笔记本数据库打不开 ics服务器什么意思 宝山区智能网络技术厂家直销 开展网络安全活动策划 明水天气预报软件开发 天津华品博睿网络技术公司 网络技术中不能用于城域网 数据库第三方 存储过程 cmmi软件开发认证价格 软件开发功能编写 网络技术给企业带来的利弊 腾讯云轻量服务器开25端口 传统软件开发方法是指什么 网络安全怎么做兼职 大兴区定制软件开发 满天星广告机怎样连接服务器 如何通过数据库查资料 鸿辉网络技术有限公司 北京百通网络技术有限公司
    0