多线程 -- Thread类的基本用法

news2024/12/23 17:52:52

本篇重点

  1. 什么是变量捕获??

  2. 有关线程的操作

     线程创建
     线程中断
     线程等待
     线程休眠
     获取线程实例
    

目录

  • 1. 线程创建
  • 2. 线程中断
    • 变量捕获
  • 线程的六种状态
    • NEW 状态
    • TERMNATED 状态
    • RUNNABLE 就绪状态
    • TIMED_WAITING 状态

1. 线程创建

关于线程的创建看上篇博客, 里面为线程的创建提供了5种方法

2. 线程中断

线程的中断, 就是让一个线程停下来
本质上来说, 让一个线程终止, 办法就一种, 让该线程的入口方法执行完毕!! (
return 或者 抛出异常等)

  1. 给线程规定一个结束标志位
public class ThreadDemo9 {
    public static boolean isQuit = false;
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (!isQuit) {
                System.out.println("hello t");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("t 线程终止");
        });
        t.start();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        isQuit = true;
    }
}

说白了就是设置一个全局变量, 在三秒的时候, 将isQuit设置成为true, 从而中断线程

变量捕获

一定是要设置成为全局变量, 这里就涉及到了变量捕获的知识点了
在这里插入图片描述
变量只能访问, 常量或者未被修改的量

上述线程中断的方法是 自己创建了一个变量来控制循环
而Thread类内置了;一个标志位, 让我们更加方便的实现上述的效果, 如下

public class ThreadDemo10 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            // currentThread 是获取到当前线程的实例
            // 此处currentThread 得到的对象就是t
            // Thread.currentThread() 等价于 t
            // isInterrupted 就是 t 对象里自带的一个标志位
            while (!Thread.currentThread().isInterrupted()){
                System.out.println("hello t");
                try {
                    Thread.sleep(1000);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
            }
        });

        t.start();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 把 t 内部的标志位给设置成true
        t.interrupt();
    }
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里sleep可以有三种操作:

  1. 忽略中断条件继续执行
	try {
	    Thread.sleep(1000);
	
	} catch (InterruptedException e) {
//  	e.printStackTrace();
//  	break;
	}
  1. 立刻中断
	try {
	    Thread.sleep(1000);
	
	} catch (InterruptedException e) {
		e.printStackTrace();
		break;
	}
  1. 等待一会再中断
	try {
	    Thread.sleep(1000);
	
	} catch (InterruptedException e) {
	    e.printStackTrace();
	    try {
	        Thread.sleep(3000);
	    } catch (InterruptedException ex) {
	        e.printStackTrace();
	    }
	    break;
	}

在这里插入图片描述

  1. 线程等待
    因为线程之间是并发执行的, 操作系统对于线程的调度, 是无序的.
    所以无法判定, 两个线程谁先执行结束, 谁后执行结束
    在这里插入图片描述
    像是上述的不确定情况可能会出现bug
    所以可以使用线程等待来实现调度的顺序
    join方法
public class ThreadDemo11 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            System.out.println("hello t");
        });
        t.start();
        t.join();
        System.out.println("hello main");
    }
}

在这里插入图片描述

join()的两个版本
join 的无参数版本, 效果是"死等"(不见不散)
join 的有参数版本, 则是指定最大时间, 如果等待的时间到了上限, 还没等到, 也就不等了

让main方法等待t线程结束, 再执行(简单来说就是.join的先执行)

线程的六种状态

操作系统里的线程, 自身是有一个状态的
但是Java Thread是对系统线程的封装, 把这里的状态又进一步的精细化了
在这里插入图片描述

NEW 状态

public class ThreadDemo12 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            System.out.println("hello t");
        });
        // 在启动之前, 获取线程状态, NEW
        System.out.println(t.getState());
        t.start();
    }
}

TERMNATED 状态

public class ThreadDemo12 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            System.out.println("hello t");
        });
        // 在启动之前, 获取线程状态, NEW
//        System.out.println(t.getState());
        t.start();
        Thread.sleep(2000);
        System.out.println(t.getState());
    }
}

RUNNABLE 就绪状态

有两种情况

  1. 正在CPU上运行
  2. 准备好随时可以去CPU上运行
public class ThreadDemo12 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            while (true) {
                // 为了防止 hello t 把线程状态冲没了, 先把它注释掉
//            System.out.println("hello t");
            }
        });
        // 在启动之前, 获取线程状态, NEW
//        System.out.println(t.getState());
        t.start();
        Thread.sleep(2000);
        System.out.println(t.getState());
    }
}

TIMED_WAITING 状态

public class ThreadDemo12 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            while (true) {
                // 为了防止 hello t 把线程状态冲没了, 先把它注释掉
//            System.out.println("hello t");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        // 在启动之前, 获取线程状态, NEW
//        System.out.println(t.getState());
        t.start();
        Thread.sleep(2000);
        System.out.println(t.getState());
    }
}

在这里插入图片描述

理解线程状态, 意义就是让我们能够更好的进行多线程代码的调试

  1. 线程休眠
  2. 获取线程实例

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

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

相关文章

数据库事务到底是什么?

目录 场景(两个用户之间进行转账操作): 需要的操作步骤: 事务 事务的四大特性: 一、原子性 (1)什么是回滚操作 (2)数据库恢复操作,如何知道数据恢复如初…

C++ Stack&queue&deque

C Stack&queue&deque 📟作者主页:慢热的陕西人 🌴专栏链接:C 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容主要讲解了栈和…

如何在华为OD机试中获得满分?Java实现【字符串通配符】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…

Rust 笔记:Rust 语言中应用正则表达式

Rust 笔记 Rust 语言中应用正则表达式 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/…

【Linux】线程详解之线程互斥与同步

文章目录 Linux线程互斥一、进程线程间的互斥相关概念1.临界资源和临界区2.互斥和原子性 二、互斥量mutex1.抢票程序是否引入互斥量现象观察2.抢票程序原理分析3.互斥量的接口4. 加锁后的程序5.互斥量原理探究 可重入VS线程安全一、概念1.线程安全2.重入 二、常见的线程不安全的…

【P37】JMeter 仅一次控制器(Once Only Controller)

文章目录 一、仅一次控制器(Once Only Controller)参数说明二、测试计划设计2.1、测试计划一2.1、测试计划二 一、仅一次控制器(Once Only Controller)参数说明 可以让控制器内部的逻辑只执行一次;单次的范围是针对某…

Spring Authorization Server 系列(一)环境搭建

Spring Authorization Server 中的scope参数解析 前提依赖版本问题确定Spring Boot 版本确定 Spring Authorization Server 版本最终的依赖 第一个 Spring Authorization Server Demo 前提 由于 Spring 最新的 OAuth2 解决方案 已经由 Spring Security 下的 OAuth2 模块独立出…

从零开始学习JavaScript:轻松掌握编程语言的核心技能①

从零开始学习JavaScript:轻松掌握编程语言的核心技能 一,JavaScript 简介为什么学习 JavaScript?JavaScript 用法 二,JavaScript 输出JavaScript 显示数据JavaScript:直接写入 HTML 输出流 三,JavaScript 语法JavaScr…

VS2022发布独立部署的.net程序

.net core支持依赖框架部署和独立部署两种方式,之前学习时是在VSCode中使用dotnet命令发布的。但是在VS2022中却不知道该如何设置。以获取PDF文件使用字体的项目为例,VS2022中默认编译的是依赖框架部署方式(编译的结果如下图所示)…

Android进阶 View事件体系(三):典型的滑动冲突情况和解决策略

Android进阶 View事件体系(三):典型的滑动冲突情况和解决策略 内容概要 本篇文章为总结View事件体系的第三篇文章,前两篇文章的在这里: Android进阶 View事件体系(一):概要介绍和实…

Oracle——数据操纵DML(一)

STU1 1、不指定字段的整行插入 在STU1中新增一名同学的基本信息,SQL如下: INSERT INTO test.stu1 VALUES(0001,牛牛,男,24,to_date(1988-05-25,YYYY-MM-DD),12外语)格式如下: INSERT INTO 表名 VALUES(值1,值2,...,值n)对于CHAR或VARCHAR等…

sql-labs SQL注入平台——第二关Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)

Less-2 GET - Error based - Intiger based (基于错误的GET整型注入) 一、先确认漏洞是否存在 (1)查询 id1返回查询结果正常 (2)查询 id1’返回查询结果报错,可能存在SQL注入 (3)查询 id1 …

路径规划算法:基于帝国主义竞争优化的路径规划算法- 附代码

路径规划算法:基于帝国主义竞争优化的路径规划算法- 附代码 文章目录 路径规划算法:基于帝国主义竞争优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用…

Dubbo环境搭建

1.搭建zookeeper注册中心环境 zookeeper下载地址 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ptMw7rb-1685261782669)(b894c0cbb6501ca97145d3b09685ae8f.png)] 在bin文件下,启动zkServer.cmd会有报错,处理需要在condi…

你所不知道的 数据在内存中储存 的来龙去脉

那么好了好了,宝子们,今天给大家介绍一下 “数据在内存中储存” 的来龙去脉,来吧,开始整活!⛳️ 一、数据类型的介绍 (1)整型和浮点型: (2)其他类型…

Linux——使用命令行参数管理环境变量

目录 使用命令行参数获取用户在DOS命令行输入的指令: 方法:代码如下: 使用命令行参数获取并打印部分或者整体环境变量的方法: 方法1: 运行结果: 方法2:使用外部链接environ: 使用命令行参数…

如何开发背包系统?

UE5 插件开发指南 前言0 背包数据结构1 背包管理组件2 背包UI显示前言 相信大家对于背包系统并不陌生,谁还没有玩过几款游戏呢?游戏中的背包都是大同小异的,朴素的功能就是存放我们获取到的物品,高级一点就是要有物品分类,便于玩家刷选背包中的物品,能够显示玩家拥有的货…

2023 牛津大学博士后申请指南

牛津大学是全球著名的高等教育机构,其博士后项目备受瞩目。为了帮助申请者更好地了解牛津大学博士后申请流程,本文将介绍该校博士后申请指南的相关内容。一、申请条件首先,申请者必须已经获得博士学位或即将完成博士学位,并具有相…

《数据库应用系统实践》------ 报刊销售系统

系列文章 《数据库应用系统实践》------ 报刊销售系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构(需包含功能结构框图和模块说明)3.系统功能简介 二、概念模型设计1.基本要素(符号介绍说明&#xff…

k8s 对已完成job自动清理

job在处理完一个任务以后,状态会变成Completed,job在状态为Completed的时候默认不会自动清理的,还会继续占用系统资源。 TTL-after-finished控制器 kubernetes中有专门的控制器可以自动清理已完成的job,就是TTL-after-finished控制器。 TTL…