多线程(三)Thread 类及常见方法

2023-11-08

一,Thread类的几个属性

在这里插入图片描述

⭐①ID 是线程的唯⼀标识,不同线程不会重复
名称是各种调试工具用到
状态表示线程当前所处的⼀个情况,下⾯我们会进⼀步说明
⭐④优先级高的线程理论上来说更容易被调度到
⑤关于守护线程(后台线程),需要记住⼀点:JVM会在⼀个进程的所有非后台线程结束后,才会结束运行。
是否存活,即简单的理解,为 run 方法是否运行结束了
线程的中断问题

属性:状态 -getState()

  Thread thread = new Thread(() ->{
            System.out.println("当前线程的状态1" + Thread.currentThread().getState());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println("当前线程的状态2" + thread.getState());
        thread.start();

属性:ID和Name–getId()和getName()

/**
 * 线程属性
 * ID和名称 ;ID一定是不同的,是动态分配的
 * 线程名称手动设置
 */
public class ThreadDemo11 {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                Thread t = Thread.currentThread();
                System.out.println("线程ID" + t.getId());
                System.out.println("线程名称" + t.getName() );
            }
        });
        thread.start();
    }
}

属性:优先级-getPriority()

/**
 * 获取优先级
 */
public class ThreadByPriority {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                // 得到当前线程,并打印线程的优先级
                Thread thread1 = Thread.currentThread();
                System.out.println("线程优先级1:" + thread1.getPriority());
            }
        });
        System.out.println("线程优先级2:" + thread.getPriority());
        thread.start();
    }
}

属性:是否守护线程-isDaemon()

 //在主线程创建子线程
        Thread t = new Thread(()->{
            Thread t1 = Thread.currentThread();
            System.out.println(t1.getName() + "是否守护线程" + t1.isDaemon());
            // 创建子线程
            Thread tt1 = new Thread(() -> {
                Thread cThread2 = Thread.currentThread();
                System.out.println(cThread2.getName() + "——是否守护线程:" + cThread2.isDaemon());
            }, "子线程的子线程1");
            tt1.start();
        },"子线程1");

属性:是否存活-isAlive()

/**
 * 线程是否存活 isAlive() -while循环
 */
public class DaemonThreadAlive {
    public static void main(String[] args) {
        Thread t = new Thread(() ->{
          for(int i=0;i < 10;i++){
              try {
                  Thread.sleep(5000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
            System.out.println("执行完了");
        });
        t.start();
        //判断是否存活
        while(t.isAlive()){
        }
        System.out.println("确认执行完了");
    }
}

二,启动一个线程-start()

线程对象可以认为是把 李四、王五叫过来了。
调用 start() 方法,就是喊⼀声:”行动起来!“,线程才真正独立去执行了

  Thread thread = new Thread(()->{
      //业务代码
    Thread thread3 = Thread.currentThread();
    System.out.println("名称" + thread3.getName());
  });
  //启动线程
  thread.start();

三,中断线程的方法

目前常见的有以下两种方式:

1.通过共享的标记来进行沟通

//声明一个自定义标识符
private volatile static boolean flag = false;

/**
 * 自定义标识符终止线程
 */
public class InterruptThread1 {
    //声明一个自定义标识符
    private volatile static boolean flag = false;
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            while(!flag){
                System.out.println("正在转账");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("差点误了大事");
        });
        thread.start();
        System.out.println("执行结束");
    }
}

标志位是否清除

标志位是否清除, 就类似于一个开关.
Thread.isInterrupted() 相当于按下开关, 开关自动弹起来了. 这个称为 "清除标志位"
Thread.currentThread().isInterrupted() 相当于按下开关之后, 开关弹不起来, 这个称为**“不清除标志位”.**

2.调用 interrupt() 方法来通知

在这里插入图片描述

//终止线程
thread.interrupt();
System.out.println(“终止交易”);

   thread.start();
   Thread.sleep(1000);

     //终止线程
   thread.interrupt();
   System.out.println("终止交易");
   System.out.println("终止标志位3" + Thread.currentThread().isInterrupted());

3,interrupted和isInterrupted的区别

①interrupted是静态方法,所有程序都可以使用的全局方法,isInterrupted是某个实例的方法
②interrupted在使用完后会重置标识符isInterrupted不会重置

具体分析请看

链接: https://blog.csdn.net/qq_55660421/article/details/123662613.

四,等待一个线程-join()

有时,我们需要等待一个线程完成它的工作后,才能进行自己的下一步工作。例如,李四只有等张三工作成功,才决定是否工作,这时我们需要一个方法明确等待线程的结束
在这里插入图片描述

public class ThreadByJoin {
    public static void main(String[] args) throws InterruptedException{
        Thread t1 = new Thread(() -> {
            // 1.张三开始上班
            System.out.println("1.张三开始上班");
            // 2.张三正在上班
            try {
                Thread.sleep(10 * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 3.张三下班
            System.out.println("3.张三下班");
        });
        // 启动程序
        t1.start();
//        while (t1.isAlive()) {
//        }
        // 等待线程 t1 执行完之后,再执行后面的代码
        t1.join();
        Thread t2 = new Thread(() -> {
            // 1.李四开始上班
            System.out.println("1.李四开始上班");
            // 2.李四正在上班
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 3.李四下班
            System.out.println("3.李四下班");
        });
        t2.start();
    }
}

五,休眠当前线程

休眠线程有两种实现:

使用 sleep 休眠

也是我们比较熟悉一组方法,有一点要记得,因为线程的调度是不可控的,所以,这个方法只能保证实际休眠时间是大于等于参数设置的休眠时间的

在这里插入图片描述

/**
 * 休眠线程
 */
public class ThreadSleep {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(10*1000);
                } catch (InterruptedException e) {
                    System.out.println("我接收到了中止执行的通知");
//                e.printStackTrace();
                }
            }
        });
        t.start();
        //休眠线程
        Thread.sleep(1000);
        System.out.println("终止子线程 thread");
        t.interrupt();//终止线程
    }
}

使用 TimeUnit 休眠

import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;

/**
 * 休眠线程
 */
public class ThreadTimeUtil {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("主线程开始执行了:" + LocalDateTime.now());
        TimeUnit.SECONDS.sleep(3); // 休眠 3s
        System.out.println("主线程又开始执行了:" + LocalDateTime.now());
    }
}

六,获取当前线程的引用

在这里插入图片描述

public class ThreadDemo {
  public static void main(String[] args) {
     Thread thread = Thread.currentThread();
     System.out.println(thread.getName());
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程(三)Thread 类及常见方法 的相关文章

随机推荐

  • 智能家居创意DIY-智能触摸面板开关

    触摸开关 即通过触摸方式控制的墙壁开关 其感官场景如同我们的触屏手机 只需手指轻轻一点即可达到控制电器的目的 随着人们生活品质的提高 触摸开关将逐渐将换代传统机械按键开关 触摸开关控制原理 触摸开关我们把它理解为三部分构成 信号控制单元 开
  • VS Code 安装

    前端开发工具 VSCode HBuilder sublime WebStorm VS Code 一 介绍 Visual Studio Code 简称 VS Code 是 Microsoft 于2015年4月发布的一款代码编辑器 VS Cod
  • 非华为电脑安装华为电脑管家多屏协同

    1 转载声明 本文转载自 http www hankeer org article non huawei computer install pcmanager html 使用工具为上述链接内的博文的博主所开发 常见问题在其博客主页有所介绍
  • python怎么搭建免费代理IP池,免费代理IP适合爬虫工作吗

    Python可以使用一些第三方库和工具来搭建免费代理IP池 简单来说 搭建代理IP池的步骤如下 1 获取代理IP 从一些免费或付费代理IP网站上爬取并验证IP地址和端口信息 2 验证代理IP 使用代理IP访问一些网站或服务 验证代理IP的可
  • 【Audio】基于STM32 I2S移植WM8978 Audio Codec驱动

    相关文章 1 Audio I2S传输PCM音频数据分析总结 一 2 Audio I2S传输PCM音频数据分析总结 二 3 Audio 基于STM32 I2S移植WM8978 Audio Codec驱动 1 WM8978简介 WM8978是一
  • 【Python】python -m pip install 和 pip install 的区别

    文章目录 一 pip install 二 python m pip install 三 两者的总结 一 pip install 当你使用 pip install 命令时 你正在使用 Python 包管理器 pip 来安装 Python 包或
  • 使用VSCode SSH公网远程连接本地服务器开发 - cpolar内网穿透

    文章目录 前言 视频教程 1 安装OpenSSH 2 vscode配置ssh 3 局域网测试连接远程服务器 4 公网远程连接 4 1 ubuntu安装cpolar内网穿透 4 2 创建隧道映射 4 3 测试公网远程连接 5 配置固定TCP端
  • Kibana 导出csv

    过几秒就会出现下面这图 直接点击Download即可
  • centos7下ldap服务搭建

    1 安装ldap服务 bin bash echo install ldap rpm yum install y openldap servers openldap clients cp usr share openldap servers
  • 计算机视觉论文

    1 Temporal Cluster Matching for Change Detection of Structures from Satellite Imagery 标题 时态聚类匹配用于卫星影像结构变化检测 链接 https arx
  • 网络编程中当强制结束TCP服务端之后客户端可能出现Connection refused错误

    当客户端连接到服务端时 强制结束服务端程序 当再次启动服务端 客户端在连接时出现Connection refused错误 原因为服务端重新启动后的端口号发生改变 改变的原因不清楚 可以用getsockname 函数获取bind 后socke
  • PyTorch:torch.nonzero——非零元素的定位

    PyTorch学习笔记 torch nonzero 非零元素的定位 torch nonzero input out None as tuple False LongTensor or tuple of LongTensors 功能 用于输出
  • Android Studio一个项目引入另一个项目作为依赖Libary

    声明 本教程不收取任何费用 欢迎转载 尊重作者劳动成果 不得用于商业用途 侵权必究 16年做的项目 因公司是某国企很注意保密 即有了奇葩要求不允许用svn git版本控制工具 所以就有了此篇文章的诞生 下面是我对以前笔记的整理 Androi
  • Linux 定时任务详解

    今天继续给大家介绍Linux基础知识 本文主要内容是Linux定时任务 一 Linux定时任务简介 计划任务是需要在指定时间执行的任务或者是周期性执行的任务 比如凌晨3点重启设备 每周对日志文件备份等 Linux系统会内置at和cron服务
  • sql的coalesce函数用法

    介绍 coalesce函数是sql里面极其实用的一个函数 具体用法如下 SELECT coalesce exp1 exp2 as info FROM table1 当exp1为NULL时 计算exp2 当exp2为空时 计算exp3 一直到
  • 历年阿里巴巴面试题集,蚂蚁金服Android面经!

    早在2017年我们就建了第一个进击BAT的Android开发进阶交流群 两年期间很多群友都分享了自己的Android面试经历 其中就有很多群友已经斩获蚂蚁金服 天猫 高德 盒马等阿里系offer 收集反馈的面经资料比较乱 最近疫情期间终于空
  • springboot之RestTemplate接口封装的示例分享

    转自 springboot之RestTemplate接口封装的示例分享 下文笔者讲述封装RestTemplate接口的示例分享 如下所示 实现思路 只需对RestTemplate方法进行相应的封装 即可实现HttpClient的效果 例 i
  • 1-3、安装Ubuntu和Windows双系统

    1 3 安装Ubuntu和Windows双系统 版本说明 版本 作者 日期 备注 0 1 loon 2019 3 4 初稿 目录 文章目录 1 3 安装Ubuntu和Windows双系统 版本说明 目录 一 初衷 二 注意 三 制作启动盘
  • rsync备份同步文件

    一 介绍 Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像 远程备份的功能 cp scp等工具拷贝均为完整的拷贝 而rsync除了可以完整拷贝外 还具有增量拷贝的功能 官方文档 https www samba org ftp
  • 多线程(三)Thread 类及常见方法

    目录 一 Thread类的几个属性 属性 状态 getState 属性 ID和Name getId 和getName 属性 优先级 getPriority 属性 是否守护线程 isDaemon 属性 是否存活 isAlive 二 启动一个线