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

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.mfbz.cn/a/470316.html

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

相关文章

六、C#快速排序算法

简介 快速排序是一种常用的排序算法&#xff0c;它基于分治的思想&#xff0c;通过将一个无序的序列分割成两个子序列&#xff0c;并递归地对子序列进行排序&#xff0c;最终完成整个序列的排序。 其基本思路如下&#xff1a; 选择数组中的一个元素作为基准&#xff08;pivot…

第四百一十二回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"给geolocator插件提交问题的结果"相关的内容&#xff0c;本章回中将介绍自定义标题栏.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

KKVIEW远程控制 手机远程控制电脑

机远程控制电脑&#xff1a;实现跨设备便捷操作 随着科技的飞速发展&#xff0c;智能手机和电脑已成为我们日常生活中不可或缺的工具。有时&#xff0c;我们可能需要在不直接接触电脑的情况下对其进行操作&#xff0c;这时&#xff0c;手机远程控制电脑的技术就显得尤为重要。…

深入理解栈和队列(一):栈

个人主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《数据结构》 一、栈的概念 栈&#xff08;Stack&#xff09;是一种特殊的线性表&#xff0c;它遵循后进先出&#xff08;Last-In-First-Out&#xff0c;LIFO&#xff09;的原则。栈可以被看作是一个只能在一端进行操作…

内网横向移动小结

windows Windows-Mimikatz 适用环境&#xff1a; 微软为了防止明文密码泄露发布了补丁 KB2871997&#xff0c;关闭了 Wdigest 功能。当系统为 win10 或 2012R2 以上时&#xff0c;默认在内存缓存中禁止保存明文密码&#xff0c;此时可以通过修改注册表的方式抓取明文&#xff…

selenium 元素定位攻略大全

一、By类单一属性定位 元素名称描述Webdriver APIidid属性driver.find_element(By.ID, "id属性值")namename属性driver.find_element(By.NAME, "name属性值")class_nameclass属性driver.find_element(By.CLASS_NAME, "class_name属性值")tag_na…

Angular进阶之八: Angular Animation在项目中的实践经验

使用 Angular 进行项目开发的程序员应该都很熟悉 Angular Animation。这是一个 Angular 原生的动画库&#xff0c;它可以替代或者辅助完成原本需要使用 css 的动画功能。 Angular 在国内的运用是很有限的&#xff0c;可借鉴的文档并不很丰富。尤其对于 Angular 动画模块的应用…

中间件-消息队列

消息队列基础知识 什么是消息队列 本处提到的消息队列是指各个服务以及系统组件/模块之间的通信&#xff0c;属于一种中间件。参与消息传递的双方称为生产者和消费者&#xff0c;生产者负责发送消息&#xff0c;消费者负责处理消息。 消息队列作用 通过异步处理&#xff0…

Node.js安装Vue3安装

文章目录 前言Node.js安装设置Node.js系统变量Vue3安装 前言 前端初学者注意&#xff1a;node.js 先安装后才能安装vue3&#xff0c;node.js在安装时会自动安装npm Node.js安装 安装包已上传CSDN,审核中 &#xff0c; 也可以nodejs官网下载 默认C盘&#xff0c;本人下载路径…

idea import的maven类报红

idea 报红/显示红色的原因 一般报红&#xff0c;显示红色&#xff0c;是因为 idea 在此路径下&#xff0c;找不到这个类。 找到是哪个 jar 包的类导致 idea 报红 点击报红的路径的上一层&#xff0c;进入jar 包。比如&#xff1a; import com.aaa.bbb.ccc.DddDto;这个 impo…

K8s-网络原理-上篇

引言 本文是学习《深入剖析K8s》网络原理部分的学习笔记&#xff0c;相关图片和案例可以从https://github.com/WeiXiao-Hyy/k8s_example获取&#xff0c;欢迎Star&#xff01; 网络基础 IP组成 IP地址由两部分组成&#xff0c;即网络地址和主机地址。网络地址表示其属于互联…

03.生命周期和工程化开发入门

一、Vue生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09;什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a;就是一个Vue实例从创建 到 销毁 的整个过程。 生命…

TikTok云手机是什么原理?

随着社交媒体的快速发展和普及&#xff0c;TikTok已成为全球最受欢迎的短视频平台之一&#xff0c;吸引了数以亿计的用户。在TikTok上&#xff0c;许多用户和内容创作者都希望能够更灵活地管理和运营多个账号&#xff0c;这就需要借助云手机技术。那么&#xff0c;TikTok云手机…

10-项目部署_持续集成-黑马头条

项目部署_持续集成 1 今日内容介绍 1.1 什么是持续集成 持续集成&#xff08; Continuous integration &#xff0c; 简称 CI &#xff09;指的是&#xff0c;频繁地&#xff08;一天多次&#xff09;将代码集成到主干 持续集成的组成要素 一个自动构建过程&#xff0c; 从…

CCIE-04-Layer2_WAN_TS

目录 实验条件网络拓朴 路由器配置开始排错&#xff0c; 要求R11可以访问R17的telnet检查R12和R11的e0/0口&#xff0c;有发现检查R17和R12的S4/0口&#xff0c; 有发现ping R17环回口地址&#xff0c;发现不通telnet R17环回口IP 实验条件 网络拓朴 路由器配置 R11 4组以太网…

基于python智慧社区家政服务系统的设计与实现flask-django-nodejs-php

随着现代网络技术发展&#xff0c;对于智慧社区家政服务系统的设计现在正处于发展的阶段&#xff0c;所以对的要求也是比较严格的&#xff0c;要从系统的功能和用户实际需求来进行对系统制定开发的发展方式&#xff0c;依靠网络技术的的快速发展和现代通讯技术的结合为人们带来…

【NLP笔记】RNN总结

文章目录 经典RNN单向RNN双向RNNDeep RNNRNN特性总结 变体RNNLSTMGRU 参考及转载内容&#xff1a; 循环神经网络&#xff08;RNN&#xff09;深度学习05-RNN循环神经网络完全理解RNN&#xff08;循环神经网络&#xff09; 传统的CNN&#xff08;Covolutional Neural Network&am…

图解CodeWhisperer的安装使用

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 &#x1f4d8; CodeWhisperer简介 &#…

C#,图论与图算法,有向图(Graph)之环(Cycle)判断的颜色算法与源代码

1 检查该图是否包含循环 给定一个有向图,检查该图是否包含循环。如果给定的图形至少包含一个循环,则函数应返回true,否则返回false。 方法:深度优先遍历可用于检测图中的循环。连接图的DFS生成树。只有当图中存在后缘时,图中才存在循环。后边是从节点到自身(自循环)或…

【计算机视觉】Gaussian Splatting源码解读补充

本文旨在补充gwpscut创作的博文学习笔记之——3D Gaussian Splatting源码解读。 Gaussian Splatting Github地址&#xff1a;https://github.com/graphdeco-inria/gaussian-splatting 论文地址&#xff1a;https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gauss…