Java多线程--Thread类的那些事3.--线程的6中状态和sleep()和 join()

   一.sleep()方法

    首先在Thead类中有一个静态的sleep()方法,可以让线程进入到休眠状态即TEMD-WAITING状

   在调用sleep()方法时需要注意的是在哪个线程里面调用sleep()方法,哪个线程就会进入阻塞状态.,在这个线程中的其他线程不会发生阻塞, 只有当休眠时间到来这个线程才会继续执行.如

public class Demo5 {
    public static void main(String[] args) throws InterruptedException {
        MyThread6 myThread6 = new MyThread6();
        myThread6.start();
        Thread.sleep(10);
        System.out.println("mian线程开始工作");
    }
}
class MyThread6 extends Thread{
    @Override
    public void run() {
        System.out.println("创建的线程名是 " + Thread.currentThread().getName());
    }
}

     在main方法中创建一个线程myThread6这个对象 并调用start()方法启动线程执行run()方法,然后Thread.sleep(10)会让main主线程进入休眠状态,休眠10毫秒后才会继续执行,打印输出.

     sleep()方法是知道要等待的时间是多少,才会调用sleep()方法.让这个线程进入休眠其他线程去执行.这样就影响了线程间的执行顺序.总的来说调用sleep()是有规划时间的让一个线程进入休眠,让其他下次线程先执行,等过了休眠时间这个线程再去执行.

二join()方法.

1.线程对象.join() 

      在多进程中,多个线程的执行顺序是无序的(因为线程的调度是"随即调度" 并且是"抢占式执行"的)虽然线程的调度是无序的,但操作系统的api 提供了一些方法可以影响线程的执行顺序 ,而这些api通过JVM又封装了一层.这些api有 Thread类中的sleep(),join()方法等.

     join()方法是让一个线程等待另一个线程执行完后才会继续执行,如让线程2 等待线程1结束,线程1结束之后线程2才会继续执行.

    在哪个线程里一个线程对象调用join(),哪个线程就阻塞,等待调用join()方法的线程结束,才会继续执行.

      为什么不用sleep()方法呢?用sleep()方法需要知道休眠的时间即要等待的线程还要多长时间结束,如果不确定自己预估一个时间可能,预估的少了,等待的线程还没结束,预估的多了,又多等了很长时间.

.这样就影响了线程结束的先后顺序.举个例子吧

public class Demo5 {
    public static void main(String[] args) throws InterruptedException {
        MyThread6 myThread6 = new MyThread6();
        myThread6.start();
        myThread6.join();
        System.out.println("mian线程开始工作");
    }
}
class MyThread6 extends Thread{
    @Override
    public void run() {
        while(true){
            System.out.println("创建的线程在执行");
        }
    }
}

    如在main()方法中myThread6调用join()方法,让main线程等待myThread6线程结束,main线程才会继续执行.在哪个线程中调用join()方法,哪个线程就阻塞,等待调用join()方法的线程执行完,这个阻塞线程才会转换成可执行状态等待cpu的调度继续执行.

 上述线程结束顺序的先后通过调用join()即系统提供的api来控制

 join()方法  主要是 1)让main线程主动放弃cpu的调度,进入阻塞状态,

                              2)等待调用join()方法的那个线程结束,才会进入可执行状态等待cpu的调度

2.线程对象.join(时间)

      join(时间) 是带有时间的等待,因为调用join()的线程可能一直在运行如"死循环",等待的线程一直会处于阻塞状态,永远也不会执行,这是就会设置一个时间,超过这个等待时间后就不继续往下等了,恢复成可执行的状态等待cpu的调度.

      join(时间) 与sleep(时间)区别:

      sleep(时间) 是提前知道了要让一个线程休眠的时间,休眠时间一到,线程就会继续执行.

    而join(时间) 是一个线程等待另一个线程结束,因某种原因被等待的线程不能结束一直在运行,join(时间)的这个时间就是保底的,不让等待的线程一直死等下去,只要过了这个时间不管被等待的线程有没有执行完,都不会继续等待下去,会回去执行自己的任务.

三.线程的六种状态.

1. NEW 状态

  处于NEW状态的线程此时尚未启动,这里的尚未启动这是还没开始调用start()方法的状态.如:

     在上一篇也讲过,处于NEW状态的线程才能调用start()方法,因为处于NEW状态时Thread类中的threadStatus = 0 才能调用本地方法start0()才能真正地创建其启动线程,处于其他状态时threadStatus 是不为0的,threadStatus使用整数来表示线程的状态的.

2.RUNNABLE状态

      表示当前线程正在执行,处于RUNNABLE状态的线程可能在JVM中运行,也有可能等待cpu分配资源也就是说RUNNABLE状态包含了ready和running两种状态.在进程中就是就绪状态和执行状态这两种.

3.BLOCKED状态:

     阻塞状态.处于BLOCKED状态的线程是在等待锁的释放也可以理解位要访问的资源正在被其他线程所占用,等待这个线程释放这个资源.

4.WAITING状态:

  等待状态. 处于等待状态的线程需要其他线程进行唤醒.

一般有三种方法会使进程进入等待状态,不过第三种是LockSupport等后面在详细讲讲.

 1)Object.wait() .使当前处于等待状态等待另一个线程唤醒它.

2)Thread.join() 等待某个线程执行完毕后,这个线程才能执行.底层调用的是Object.wait()方法

5.TIMED_WAITING状态

超时等待状态.线程等待一个具体的时间,时间过后会自动唤醒.

有3中方式可以进入超时等待状态:

1) Object.wait(long millis): 线程休眠指定时间,等待期间可以被notify()或notifyAll()唤醒.

2)Thread.sleep(long millis):使当前线程睡眠指定的时间.

3)Thread.join(long millis): 等待某个线程最多 millis毫秒.

6.TEMINATED状态.

执行完毕状态.线程执行完run()方法了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/909897.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL表设计(三大范式 表的设计)

1.上讲约束复习: 1.NOT NULL 非空约束,被指定NOT NULL的列,值不允许为空(必填) 2. UNIQUE 唯一约束,这个列里的值在表中是唯一的,也就是说不能重复 3. PRIMARY KEY 主键约束,可以看做是NOT NULL和UNIQUE…

基于SpringBoot的免税商品优选购物商城的设计与实现

一、项目背景 从古至今,通过书本获取知识信息的方式完全被互联网络信息化,但是免税商品优选购物商城,对于购物商城工作来说,仍然是一项非常重要的工作。尤其是免税商品优选购物商城,传统人工记录模式已不符合当前社会…

RabbitMQ 存储机制

一、消息存储机制 不管是持久化的消息还是非持久化的消息都可以被写入到磁盘。持久化的消息在到达队列时就被写入到磁盘,非持久化的消息一般只保存在内存中,在内存吃紧的时候会被换入到磁盘中,以节省内存空间。这两种类型的消息的落盘处理都…

Kafka自动生产消息软件(自动化测试Kafka)

点击下载《Kafka服务端(含Zookeeper)一键自启软件》 点击下载《kafka客户端生产者消费者kafka可视化工具(可生产和消费消息)》 点击下载《Kafka自动生产消息软件》 1. 前言 在软件开发过程中,Kafka常被用作消息队列来处理特定的业务功能。为…

C#应用随系统启动 - 开源研究系列文章

上次写过一个随系统启动的例子,不过那个是写到注册表中的,自从更新Windows操作系统后就不好使了,所以就换了个方式,只是将应用的快捷方式添加到操作系统的启动目录里,这样随系统启动。 1、 项目目录; 2、 源…

大语言模型在交通领域的应用分析

大语言模型在交通领域的研究进展 前言: 大语言模型(Large Language Models, LLMs)如 GPT (Generative Pre-trained Transformer) 系列,BERT (Bidirectional Encoder Representations from Transformers) 和其他基于 Transformer …

快速删除iPhone照片:释放你的空间,加速你的手机

随着时间的推移,我们的iPhone往往会积累下大量的照片,这不仅占用了大量的存储空间,还可能影响手机的性能。如果你正寻找一种快速、高效的方法快速删除iPhone照片,以下的策略将会大有帮助。此外,本文还将介绍如何利用Cl…

matlab 质心重合法实现点云配准

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、初始位置2、配准结果本文由CSDN点云侠原创,原文链接,首发于:2024年11月5日。 一、算法原理 1、原理概述 质心重合法是将源点云 P P P

MySQL数据库中的视图

视图 ​ 本篇将开始介绍有关数据库中视图的相关知识点,其中主要包含视图的基本使用,视图规则和限制。 ​ 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,视图的数据变化会…

软件测试基础:单元测试与集成测试

单元测试的重要性 单元测试是软件开发过程中的必要步骤。它通过针对软件的最小可测试单元进行测试,可以及早发现代码中的逻辑错误和缺陷。根据统计数据显示,单元测试可以在软件开发初期就发现约70%的错误,从而减少了后期修改的成本和时间消耗…

昆仑通态触摸屏-如何完成几个窗口的切换

一、启动窗口 想要哪一个窗口是启动时第一个显示的,就把谁设置为启动窗口就可以。 二、公共窗口 给一个窗口命名为公共窗口 然后选择一个窗口,将他的公共窗口设置为我们刚才命名的那个窗口 三、页面切换 页面切换,是通过在公共窗口内设置按…

修改elementUI等UI组件样式的5种方法总结,哪些情况需要使用/deep/, :deep()等方式来穿透方法大全

文章目录 方法 1:全局修改样式示例:修改 `ElMessage` 的背景色和字体颜色方法 2:修改特定类型的 `ElMessage` 样式-全局-不需要穿透示例:修改 `ElMessage` 成功类型的样式方法 3:通过 Scoped CSS 在组件内部修改-局部-不需要穿透方法 4:使用 JavaScript 动态修改样式-不需…

SpringBoot中使用SpringTask实现定时任务

SpringBoot默认在无任何第三方依赖的情况下使用spring-context模块下提供的定时任务工具SpringTask。我们只需要使用EnableScheduling注解就可以开启相关的定时任务功能。 定义一个SpringBean,然后定义具体的定时任务逻辑方法并使用Scheduled注解标记该方法即可。…

CTF中的phar反序列化 [SWPU 2018]SimplePHP

以[SWPU 2018]SimplePHP 这道题为例 页面可以查看文件和上传文件 点击查看文件,发现url变成/file.php?file 猜测可能存在文件包含,可以读取文件 尝试读取index.php文件 回显了源码 再读取base.php 只看最后有信息的代码: <!--flag is in f1ag.php--> 提示flag在f1…

车载通信架构 --- PNC、UB与信号的关系

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

C++进阶-->红黑树的实现

1、红黑树的概念 红黑树是一棵二叉搜索树&#xff0c;他和前面AVL树不同的是红黑树不是通过平衡因子来保证树的平衡&#xff0c;而是在树结点的处加多了个记录颜色的变量&#xff0c;这个变量可以是红色或者黑色。通过对任何一条从根到叶子的路径上各个结点的颜色进行约束&…

微信公众号绑定设计-WeChat public platform bing and send message

一 WeChat bind ui 二、message style 三、 consume style 四、send log 五、temp setting

Linux多线程(个人笔记)

Linux多线程 1.Linux线程概念1.1线程的优点1.2线程的缺点 2.Linux线程VS进程3.Linux线程控制3.1创建线程3.2线程tid及进程地址空间布局3.3线程终止3.4线程等待 4.分离线程5.线程互斥5.1互斥锁mutex5.2互斥锁接口5.3互斥锁实现原理5.4可重入VS线程安全 6.线程同步6.1条件变量6.2…

Java项目实战II基于Spring Boot的药店管理系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着医疗行业的快速发展和人们对健康需…

LDO电路分析

一、LDO概述 在电压转换电路中&#xff0c;LDO和DC-DC电路是最常用的两种方式&#xff0c;本篇主要介绍LDO相关内容。 LDO是线性电源的一种&#xff0c;它可以实现电源电压的转换&#xff0c;不过主要用在降压领域。它的全称是Low Dropout Regulaor&#xff0c;就是低压差线性…