【多线程】Thread类的用法

news2024/12/28 19:52:39

文章目录

    • 1. Thread类的创建
      • 1.1 自己创建类继承Thread类
      • 1.2 实现Runnable接口
      • 1.3 使用匿名内部类创建Thread子类对象
      • 1.4 使用匿名内部类创建Runnable子类对象
      • 1.5 使用lambda创建
    • 2. Thread常见的构造方法
      • 2.1 Thread()
      • 2.2 Thread(Runnable target)
      • 2.3 Thread(String name)
      • 2.4 Thread(Runnable target, String name)
    • 3. Thread常见的属性
    • 4. 线程的使用
      • 4.1 启动线程
      • 4.2 中断线程
      • 4.3 等待线程
      • 4.4 休眠线程

1. Thread类的创建

1.1 自己创建类继承Thread类

package Thread;

//继承Thread类实现线程
class MyThread extends Thread{
    @Override
    public void run() {
            System.out.println("hello run");
    }
}
public class Dome1 {
    public static void main(String[] args){
    	//创建线程
        MyThread myThread = new MyThread();
        //启动线程
        myThread.start();
    }
}

1.2 实现Runnable接口

//使用Runnable的方式创建线程
class MyRunnable implements Runnable{
    @Override
    public void run() {
            System.out.println("hello run");
    }
} 
public class Dome2 {
    public static void main(String[] args){
    	//创建线程
        MyRunnable myRunnable = new MyRunnable();
        Thread t = new Thread(myRunnable);
        //启动
        t.start();
    }
}

1.3 使用匿名内部类创建Thread子类对象

//通过匿名内部类的方式创建线程
public class Dome3 {
    public static void main(String[] args) {
    	//创建线程
        Thread t = new Thread(){
            @Override
            public void run() {
                    System.out.println("hello run");
            }
        };
        //启动线程
        t.start();
    }
}

1.4 使用匿名内部类创建Runnable子类对象

//使用匿名内部类创建Runnable子类对象
public class Dome4 {
    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                    System.out.println("hello run");
            }
        });
        t.start();
}

1.5 使用lambda创建

//lambda实现线程
public class Dome5 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread( () -> {
                System.out.println("hello run");
        });
        t.start();
    }
}

2. Thread常见的构造方法

2.1 Thread()

//创建Thread对象
Thread t = new Thread();

2.2 Thread(Runnable target)

//使用Runnable对象创建线程对象
Thread t = new Thread(new Runnable);

2.3 Thread(String name)

//为这个线程命名
Thread t = new Thread("名字");

2.4 Thread(Runnable target, String name)

//使用Runnable对象创建线程对象并命名
Thraed t = new Thread(new Runnable,"名字");

3. Thread常见的属性

属性获取方法
IDgetId()
namegetName()
状态getState()
优先级getPriority()
是否为后台线程isDaemon()
是否存活isAlive()
是否中断isInterrupted()
public class Test4 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            //Thread.currentThread调用当前线程对象,相当于t,这个时候t还未初始化成功,不能直接使用
            System.out.println("ID: " + Thread.currentThread().getId());
            System.out.println("name: " + Thread.currentThread().getName());
            System.out.println("状态: " + Thread.currentThread().getState());
            System.out.println("优先级: " + Thread.currentThread().getPriority());
            System.out.println("是否为后台线程: "  + Thread.currentThread().isDaemon());
            System.out.println("是否存活: " + Thread.currentThread().isAlive());
            System.out.println("是否中断: " + Thread.currentThread().isInterrupted());
        });
        t.start();
    }
}

运行结果1

注意:

  1. ID 是线程的唯一标识,不同线程不会重复
  2. 名称是各种调试工具用到
  3. 状态表示线程当前所处的一个情况,下面我们会进一步说明
  4. 优先级高的线程理论上来说更容易被调度到
  5. 关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行。
  6. 是否存活,即简单的理解,为 run 方法是否运行结束了

4. 线程的使用

4.1 启动线程

前面我们已经知道了线程的创建,构造等方法,但这些其实都是准备工作,还没有真正的从底层创建出一个线程,只有调用start方法够才算真正的创建成功线程。
//直接调用就可以 t.start()

4.2 中断线程

当线程启动的时候,有时里面是循环,这时线程便不会停止,我们便要想办法中断线程。中断线程有个简单的方法直接使用Thread.stop()方法,但是,这种方法是unsafe,而且基本上已经deprecated。
所以我们调用interrupt()方法进行停止线程,但它并不会直接停止线程,而是对线程内进行标记,标记为Boolean类的true。这个时候我们再调用下面两个方法。
public static boolean interruputed();测试线程是否为中断状态,还执行后会标记清除为false。
public boolean isInterputed();测试线程是否为中断状态,但不清除标记。

添加标志符进行中断:

//中断线程,添加标志位
public class Test3 {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
        	//
           while(!Thread.currentThread().isInterrupted()){
               System.out.println(Thread.currentThread().getName());
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
//                   e.printStackTrace();
                   break;
               }
           }
        });
        //启动线程
        t1.start();
        //休眠3秒
        Thread.sleep(3000);
        t1.interrupt();
    }
}

注意:
如果休眠中中断线程,则会异常,反之,也是。

//中断线程,添加标志位
public class Test3 {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
//           while(!Thread.currentThread().isInterrupted()){
               try {
                   Thread.sleep(100000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
                   System.out.println("异常!");
               }
//           }
            System.out.println("end!");
        });
        t1.start();
        Thread.sleep(3000);
        t1.interrupt();
        System.out.println(t1.isInterrupted());
        System.out.println(Thread.interrupted());
    }
}

在这里插入图片描述

4.3 等待线程

方法说明
join()等待线程结束
join(long millis)等待线程结束,最多等待millis毫秒
join(long millis,int nanos)和2相比更加的精确

当我们同时启动几个线程,由于线程启动时随机无序的,我们无法得知谁先结束,这个时候就可以使用join方法让线程等待。

例如:当我们想让张三先上班,等张三上班结束,李四接班,那么我们就可以写出下面代码。

public class Test5 {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()){
                System.out.println(Thread.currentThread().getName() + "在上班");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e ){
                    break;
                }
            }
        },"张三");
        Thread t2 = new Thread(() -> {
           while(!Thread.currentThread().isInterrupted()){
               System.out.println(Thread.currentThread().getName() + "在上班");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   break;
               }
           }
        },"李四");
        System.out.println("监督张三");
        t1.start();
        Thread.sleep(3000);
        t1.interrupt();
        t1.join();
        System.out.println("监督李四");
        t2.start();
        Thread.sleep(3000);
        t2.interrupt();
        t2.join();
    }
}

4.4 休眠线程

线程在执行的时候是非常快的,这个时候我们就可以让线程执行一次后就休眠一定时间,便于更好的观察。
上面代码中我们也多次用到。

Thread.sleep(long millis),里面millis单位是毫秒。

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

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

相关文章

使用CSS的@media screen 规则为不同的屏幕尺寸设置不同的样式(响应式图片布局)

当你想要在不同的屏幕尺寸或设备上应用不同的CSS样式时,可以使用 media 规则,特别是 media screen 规则。这允许你根据不同的屏幕特性,如宽度、高度、方向等,为不同的屏幕尺寸设置不同的样式。 具体来说,media screen…

开发者插件推荐FeHelper

开发者巨好用的插件、有很多功能比如json美化、对比,二维码/解码,图片转Base64,时间戳转换等 一、下载插件 1、打开网址:FeHelper - Awesome(建议用谷歌打开); 2、选择要下载的版本&#xff0c…

系统架构设计高级技能 · 云原生架构设计理论与实践

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估(二)【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

第61步 深度学习图像识别:多分类建模(TensorFlow)

基于WIN10的64位系统演示 一、写在前面 截至上期,我们一直都在做二分类的任务,无论是之前的机器学习任务,还是最近更新的图像分类任务。然而,在实际工作中,我们大概率需要进行多分类任务。例如肺部胸片可不仅仅能诊断…

YOLO目标检测——脑肿瘤检测数据集下载分享

脑肿瘤检测数据集是用于训练和评估脑肿瘤检测算法和模型的数据集,共同500张高清图像。 数据集点击下载:YOLO脑肿瘤检测数据集500图像.rar

政务大厅人员睡岗离岗玩手机识别算法

人员睡岗离岗玩手机识别算法通过pythonyolo系列网络框架算法模型,人员睡岗离岗玩手机识别算法利用图像识别和行为分析,识别出睡岗、离岗和玩手机等不符合规定的行为,并发出告警信号以提醒相关人员。Python是一种由Guido van Rossum开发的通用…

TypeScript-- 配置Typescript环境(1)ts 转js,tsc --watch 实时编译

文章目录 安装Typescript判断是否有运行权限编写第一Typescript文件手动编译Ts文件转Js文件实时编译 安装Typescript npm install -g typescript 判断是否有运行权限 命令行运行 tsc -v 遇到了权限问题 用管理员打开window自带的powershell 运行如下指令即可: Set-…

C++对象调用优化

C对象调用优化 临时对象拷贝构造新对象,临时对象就不会产生!!! 常见的对象调用过程 c编译器对于对象构造的优化:用临时对象拷贝新对象的时候,临时对象就不产生了,直接构造新对象就可以了。 …

DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION 论文精度笔记

DEFORMABLE DETR DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION 参考:AI-杂货铺-Transformer跨界CV又一佳作!Deformable DETR:超强的小目标检测算法! 摘要 摘要部分,作者主要说明了如…

STM32F4X Systick系统滴答定时器

STM32F4X Systick系统滴答定时器 Systick定时器Systick使用Systick时钟源Systick寄存器Systick频率计算Systick例程 Systick定时器 在以Crotex-M4为架构的MCU中,都会有一个Systick内核定时器,这个定时器的作用可以给系统一个心跳时钟,通常用…

python3/pip3 SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

环境: mac os 背景: 电脑之前安装的是python3.9 , 现在升级到python3.10。 从python官网下载macos版本的python3.10 pkg。 双击安装。 程序使用aiohttp访问ebay 。 出错: aiohttp.client_exceptions.ClientConnectorCertifi…

图论算法基础:最小生成树算法(kruskal算法和Prim算法)

文章目录 一.图邻接矩阵数据结构二.kruskal算法算法实现思想kruskal算法接口实现 三.Prim算法Prim算法接口实现 一.图邻接矩阵数据结构 以STLvector和unordered_map为适配容器实现图数据结构: namespace Graph_Structure {//Vertex是代表顶点的数据类型,Weight是边…

系统架构设计高级技能 · 大数据架构设计理论与实践

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估(二)【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

最新WAF信息收集技术

WAF信息收集 目前,市面上的WAF大多都部署了云服务进行防护加固,让WAF的防护性能得到进一步提升。 图1-32所示为安全狗最新版服务界面,增加了“加入服云”选项。 安全狗最新版服务界面,不仅加强了传统的WAF防护层,还增…

七层、四层和五层网络模型区别和联系

七层、四层和五层网络模型区别和联系 概述OSI网络7层模型(概念型框架)概述图片分析 四层模型概述常用协议OSI与TCP/IP四层的区别 五层模型概述三种网络模型对比 总结 概述 网络模型-七层模型(OSI模型)、五层协议体系结构和TCP/IP…

[C++ 网络协议] 多进程服务器端

具有代表性的并发服务器端实现模型和方法: 多进程服务器:通过创建多个进程提供服务。✔ 多路复用服务器:通过捆绑并统一管理I/O对象提供服务。 多线程服务器:通过生成与客户端等量的线程提供服务。 1. 进程的概念及应用 1.1 什么…

基于算术优化算法优化的BP神经网络(预测应用) - 附代码

基于算术优化算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于算术优化算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.算术优化优化BP神经网络2.1 BP神经网络参数设置2.2 算术优化算法应用 4.测试结果:5…

mybatis自动生成文件配置记录

记录下mybatis自动生成mapper文件&#xff0c;虽然现在有点过时了&#xff0c;但对于新手来说还是有一定用处的&#xff08;diss下通过这种文章引流关注的博主&#xff09;。 比较简单&#xff0c;基本就三步搞定&#xff01; 1、pom配置 <!--mybatis自动生成代码插件-->…

【Qt学习】07:绘图与绘图设备

OVERVIEW 绘图与绘图设备一、QPainter二、QPainterDevice1.QPixmap2.QBitmap3.QImage4.QPicture 绘图与绘图设备 一、QPainter Qt 的绘图系统允许使用API在屏幕和其它打印设备上进行绘制&#xff0c;整个绘图系统基于QPainter&#xff0c;QPainterDevice和QPaintEngine三个类&…

Eplan软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Eplan软件是一款专为电气专业设计开发的软件&#xff0c;旨在提高电气设计的效率和质量。以下是Eplan软件的详细介绍。 1、Eplan的历史和演变 Eplan是一款由德国Eplan公司开发的电气设计软件&#xff0c;自1984年推出以来&…