【Thread 线程】线程的方法与状态

news2024/11/29 2:47:39
SueWakeup

                                                      个人中心:SueWakeup

                                                      系列专栏:学习Java

                                                      个性签名:保留赤子之心也许是种幸运吧  

 

 

本文封面由 凯楠📷 友情赞助播出!

 目录

一个线程的生命周期

线程终止的原因

线程的方法

 Thread 类的静态方法

1. 设置线程的优先级与休眠

2. 中断线程

3. 让出线程

4. 守护线程

5. 线程插队

注:手机端浏览本文章可能会出现 “目录”无法有效展示的情况,请谅解,点击侧栏目录进行跳转  


一个线程的生命周期

线程是一个动态执行的过程,它也有一个从产生到死亡的过程。

  • 新建状态(New):使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程
  • 运行状态(Runnable):运行中的线程,已经调用 start() 方法,线程正在或即将执行 run() 方法
  • 终止状态(Terminated):线程已终止,因为 run() 方法执行完毕
  • 阻塞状态(Blocked):运行中的线程,在等待竞争锁时,被阻塞,暂不执行
  • 等待状态(Waiting):运行中的线程因为 sleep() 或 join() 等方法调用,进入等待
  • 计时等待状态(Timed Waiting):运行中的线程,因为执行 sleep(X ms) 或 join(X ms)等方法,进入计时等待

线程终止的原因

  • 正常终止:run() 方法执行到 return 语句返回
  • 意外终止:run() 方法因为未捕获的异常导致线程终止
  • 对某个线程的 Thread 实例调用 stop() 方法强制终止(不推荐)

线程的方法

序号方法描述
1

public void start()

JVM 调用该线程的 run() 方法

2

public void run()

如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run方法

否则,该方法不执行任何操作并返回

3

public final void setName(String name)

改变线程名称

4

public final void setPriority(int priority)

更改线程的优先级

5

public final void setDaemon(boolean on)

将该线程标记为守护线程或用户线程

6

public final void join(long millisec)

等待该线程终止的时间最长为 millis 毫秒

7

public void interrupt()

中断线程

8

public final boolean isAlive()

测试线程是否处于活动状态

 Thread 类的静态方法

序号方法描述
1

public static void yield()

暂停当前正在执行的线程对象,并执行其他线程。

2

public static void sleep(long millisec)

在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),受系统计时器和调度程序精度和准确性的影响。

3

public static boolean holdsLock(Object x)

当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。

4

public static Thread currentThread()

返回对当前正在执行的线程对象的引用。

5

public static void dumpStack()

将当前线程的堆栈跟踪打印至标准错误流。

1. 设置线程的优先级与休眠

class MyTask implements Runnable{

    @Override
    public void run() {
        char c ='6';
        for(int i=1;i<=26;i++,c++){
            //线程的休眠
//            try {
//                Thread.sleep(1000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }

            System.out.println(Thread.currentThread().getName()+":"+c);
        }
    }
}
         /*
        线程的设置
         */
        MyTask task = new MyTask();
        Thread t1 = new Thread(task, "线程1");
        Thread t2 = new Thread(task);
        t2.setName("线程2");

        //设置线程的优先级(起参考作用)
        t1.setPriority(1);
        t2.setPriority(10);

        t1.start();
        t2.start();

解读:

  • 通过 Thread 对象 t1 / t2 的 setPriority() 方法设置线程优先级,1为最低优先级,10为最高优先级
  • 注释部分为线程的休眠部分 Thread.sleep(1000):休眠1秒

2. 中断线程

        //线程中断
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("子线程开始执行");
                //Thread.sleep();方法可以自动监听中断状态
//                try {
//                    Thread.sleep(6000);//子线程休眠6000豪秒
//                } catch (InterruptedException e) {
//                    System.out.println("子线程中断");
//                }

                //检查当前线程是否处于中断
                while (!Thread.currentThread().isInterrupted()){
                    System.out.println("塔塔开...");
                }
                System.out.println("子线程结束执行");
            }
        });

        t.start();
        try {
            Thread.sleep(3000);//主线程休眠3000毫秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //设置子线程t的中断状态
        t.interrupt();
        System.out.println("main主线程结束执行......");

解读:

  • 通过 Thread.currentThread().isInterrupted() 方法检查当前线程是否处于中断状态
  • 如果取消注释掉的部分,子线程会在休眠期间被中断

3. 让出线程

        //线程的让出
        Thread t1 =new Thread(new Runnable() {
            @Override
            public void run() {
                char c='a';
                for(int i=1;i<27;i++,c++){
                    System.out.println(Thread.currentThread().getName()+":"+c);

                }
            }
        },"子线程1");

        Thread t2 =new Thread(new Runnable() {
            @Override
            public void run() {
                for(char i ='a';i<'z';i++){
                    //让出线程cpu处理器的执行
                    Thread.yield();
                    System.out.println(Thread.currentThread().getName()+":"+i);
                }
            }
        },"子线程2");

        t1.start();
        t2.start();

解读:

  • 在 t1 线程的 run() 方法中每次循环打印一个字母,t2 线程会在每次循环中,调用 Thread.yield() 方法来让出线程的 CPU 执行权
  • 线程 t1 和 t2 会交替执行,但是因为 t2 使用了 Thread.yield() 方法,增加了线程切换的可能性,影响线程的效率

4. 守护线程

        //守护线程
        Thread t1 =new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(6000);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("子线程结束执行!");
            }
        },"子线程1");

        //设置为守护线程
        t1.setDaemon(true);
        t1.start();

        //main主线程在子线程休眠结束前恢复
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Game Over~~");

解读:

  • 通过调用 t1.setDaemon(true) 将线程 t1 设置为守护线程,当所有非守护线程结束时,守护线程会随之结束

5. 线程插队

class MyTask1 implements Runnable{

    @Override
    public void run() {
        char c ='一';
        for(int i=1;i<27;i++,c++){
            System.out.println(Thread.currentThread().getName()+":"+c);
        }
    }
}
        //子线程的插队
        MyTask1 task = new MyTask1();
        Thread t1 = new Thread(task,"子线程1");

        t1.start();
        try {
            t1.join(1000);

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程执行结束,完成执行");

解读:

  • 调用 t1.join(1000) 方法,让主线程等待 t1 线程执行完毕或等待一定的时间,在等待 t1 线程执行完毕或超时后,主线程才开始执行

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux单机部署hadoop

1.下载安装包 https://archive.apache.org/dist/hadoop/common/ 2.上传压缩 3.修改配置文件 1)设置JDK的路径 cd /usr/local/software/hadoop-3.1.3/etc/hadoop vi hadoop-env.sh export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.402.b06-1.el7_9.x86_64/ 查看…

【数据结构和算法初阶(C语言)】二叉树的顺序结构--堆的实现/堆排序/topk问题详解---二叉树学习日记②1

目录 ​编辑 1.二叉树的顺序结构及实现 1.1 二叉树的顺序结构 2 堆的概念及结构 3 堆的实现 3.1堆的代码定义 3.2堆插入数据 3.3打印堆数据 3.4堆的数据的删除 3.5获取根部数据 3.6判断堆是否为空 3.7 堆的销毁 4.建堆以及堆排序 4.1堆排序---是一种选择排序 4.2升序建大堆&a…

微信小程序 canvas层级过高覆盖原生组件

一、背景 微信小程序中使用signature第三方插件完成签名效果&#xff0c;但真机调试时发现canvas层级过高遮挡了按钮 二、具体问题 问题原因&#xff1a;签名后点击按钮无法生效 问题代码&#xff1a; <template><view class"sign_page" v-cloak>&l…

nodejs基于vue超市信息管理系统flask-django-php

互联网的快速发展&#xff0c;使世界各地的各种组织的管理方式发生了根本性的变化&#xff0c;我国政府、企业等组织在上个世纪90年代就已开始考虑使用互联网来管理信息。由于以前的种种因素&#xff0c;比如网络的普及率不高&#xff0c;用户对它的认知度不够&#xff0c;以及…

计算机网络:数据交换方式

计算机网络&#xff1a;数据交换方式 电路交换分组交换报文交换传输对比 本博客介绍计算机之间数据交换的三种方式&#xff0c;分别是电路交换、分组交换以及报文交换。 电路交换 我们首先来看电路交换&#xff0c;在电话问世后不久&#xff0c;人们就发现要让所有的电话机都…

基于Spring Boot网络相册设计与实现

摘 要 网络相册设计与实现的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&am…

【OCR】OCR开源文字识别工具

在日常的工作中&#xff0c;例如自动化测试开展时&#xff0c;经常涉及到一些验证码识别、文本识别、图像识别的场景&#xff0c;市面上虽也有很多识别工具&#xff0c;但质量、准确性参差不齐。 今天给大家推荐一个开源OCR项目:Umi-OCR&#xff0c;功能很强大&#xff0c;而且…

jquery 列表框可以手动修改(调用接口修改)

类似于这种 直接上代码 列表框 <td>//目的主要是获取属性名的(要更改的属性名) 在下面juqery的这一行(var field $(thisobj).prev(input).attr(name);)有体现<input type"hidden" name"voyage" value"${M_PSI_PERIOD_INFO.port}">…

Vulnhub - Hacker_Kid

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog Hacker_Kid 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/hacker-kid-101,719/ WP 参考&…

路由器里如何设置端口映射?

在互联网时代&#xff0c;我们经常需要将内部网络的服务暴露到公网以便其他人访问。直接将内部网络暴露在公网上存在一定的安全风险。为了解决这个问题&#xff0c;我们可以利用路由器里设置端口映射来实现将特定端口的访问请求转发到内部网络的特定设备上。 端口映射的原理 端…

机器人离散化阻抗控制

机器人离散化阻抗控制是一种控制策略&#xff0c;它结合了阻抗控制的思想与离散化方法&#xff0c;以实现对机器人运动与外力之间动态关系的精细调节。这种控制方法旨在使机器人在与环境交互时能够表现出期望的阻抗特性&#xff0c;从而实现对接触力和位置的精确控制。 在离散…

AnyGo for Mac最新激活版:位置模拟软件打破地域限制

AnyGo for Mac&#xff0c;一款专为Mac用户打造的位置模拟软件&#xff0c;让您能够轻松打破地域限制&#xff0c;畅享无限可能。 软件下载&#xff1a;AnyGo for Mac v7.0.0最新激活版 通过AnyGo&#xff0c;您可以随时随地模拟出任何地理位置&#xff0c;无论是国内热门景点还…

轻松解锁微博视频:基于Perl的下载解决方案

引言 随着微博成为中国最受欢迎的社交平台之一&#xff0c;其内容已经变得丰富多彩&#xff0c;特别是视频内容吸引了大量用户的关注。然而&#xff0c;尽管用户对微博上的视频内容感兴趣&#xff0c;但却面临着无法直接下载这些视频的难题。本文旨在介绍一个基于Perl的解决方…

3D开发工具HOOPS如何助力3D项目实现扩展现实技术?

在当今数字化时代&#xff0c;扩展现实&#xff08;Augmented Reality&#xff0c;AR&#xff09;技术的应用已经逐渐深入到各行各业&#xff0c;为用户带来了前所未有的沉浸式体验。而在实现这种技术的开发过程中&#xff0c;HOOPS技术的运用无疑是一种强大的助力。HOOPS是一种…

WPF按钮相关

跟着官网敲的按钮相关的内容,还涉及了wpf很多其他的知识 1.创建基本按钮 <Grid><StackPanel HorizontalAlignment"Left"><Button>Button1</Button><Button>Button2</Button><Button>Button3</Button></StackPan…

WebMvcConfigurationSupport 注册自定义拦截器 Java SpringBoot

WebMvcConfigurationSupport 注册自定义拦截器 Java SpringBoot 说明 定义拦截器 拦截器&#xff08;Interceptor&#xff09;类&#xff0c;用于在处理请求之前进行一些操作。 实现方式&#xff0c;让类实现HandlerInterceptor。 在preHandle方法中进行请求拦截的逻辑操作…

海外社交营销为什么用云手机?不用普通手机?

海外社交营销作为企业拓展海外市场的重要手段&#xff0c;正日益受到企业的青睐。云手机以其成本效益和全球性特征&#xff0c;成为海外社交营销领域的得力助手。那么&#xff0c;究竟是什么特性使得越来越多的企业选择利用云手机进行海外社交营销呢&#xff1f;下文将对此进行…

31-Java前端控制器模式(Front Controller Pattern)

Java前端控制器模式 实现范例 前端控制器模式&#xff08;Front Controller Pattern&#xff09;是用来提供一个集中的请求处理机制&#xff0c;所有的请求都将由一个单一的处理程序处理该处理程序可以做认证/授权/记录日志&#xff0c;或者跟踪请求&#xff0c;然后把请求传给…

32位ARM微控制器: TLE9877QTW40XUMA1、CY9BF416NPMC-G-JNE2、CY9BF316NPMC-G-JNE2描述、器件参数

1、TLE9877QTW40 IC MCU 32BIT 64KB FLASH 48TQFP 描述&#xff1a;TLE9877QTW40属于TLE987x产品系列。TLE9877QTW40是一款单芯片三相电机驱动器&#xff0c;集成了行业标准的Arm Cortex -M3内核&#xff0c;能够实现先进的电机控制算法&#xff0c;例如磁场定向控制。它包括六…

使用 ArcGIS Pro 和 Google Earth Engine 可视化地表温度

在这项研究中,利用 Landsat 热数据通过各种方法检查了 2013 年和 2023 年恰纳卡莱省的地表温度变化。使用了 NDVI、大气层顶部、亮度温度、植被比例和地表温度等公式。研究结果表明,从热图像中获得的数据,特别是地表温度(LST),是土地解释的重要资源。 研究区域:恰纳卡莱…