JavaEE初阶:多线程 - Thread 类的基本用法

上次我们了解了多线程的五种创建方法,今天来学习Thread的基本用法。

目录

run和start

Thread常见的构造方法

Thread的几个常见属性

后台线程

是否存活

线程终止

1.使用标志位

2.使用Thread自带的标志

等待线程


run和start

首先需要理解Thread的run和start的区别:

run描述了线程要做的工作,start让内核创建一个PCB,也就是让操作系统新建一个线程。

如果不调用start,那么就不会在内核中有新的线程。

Thread常见的构造方法

第二、三、四个方法,其实都只是给线程起了个名字,线程默认的名字,叫做thread-0之类的,我们新建一个线程来看一下。

public class demo6 {public static void main(String[] args) {Thread t = new Thread(new Runnable() {@Overridepublic void run() {while(true){System.out.println("hello");}}},"mythread_demo");t.start();}
}

 通过jconsole可以看到我们自己命名的线程出现了。

Thread的几个常见属性

 

1.ID 是线程的唯一标识,不同线程不会重复

2.名称是各种调试工具用到,这里是构造方法里取的名字

3.线程状态 

4.优先级高的线程理论上来说更容易被调度到

5.关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行。

6.是否存活,即简单的理解,为run方法是否运行结束了

7.线程的中断问题,我们待会再说。

后台线程

后台进程,又叫做守护线程。

前台线程,会阻止进程结束.前台线程的工作没做完,进程是完不了的。
后台线程,不会阻止进程结束.后台线程工作没做完,进程也是可以结束的。

JVM必须在所有前台进程结束后,才会结束运行。

代码里手动创建的线程,默认都是前台的.包括main 默认也是前台的.
其他的jvm自带的线程都是后台的.
也可以手动的使用setDaemon设置成后台线程.是后台线程,就是守护线程。

t.setDaemon(true);

可以用这个代码把t设置成后台进程,这样进程的结束就和t无关。

是否存活

isAlive是在判断,当前系统里面的这个线程是不是真的有了。

在真正调用start之前,调用t.isAlive就是false。调用start之后, isAlive就是true。

线程终止

终止的意思是,不是让线程立即就停止,而是通知线程,你应该要停止了。是否真的停止取决于线程这里具体的代码写法。

1.使用标志位

在创建多线程的代码前面,加上一个flag变量,作为标志位,最后由flag控制进程是否停止。这样在最后停止时,就是由flag决定的。

但是如果在while(flag)中sleep休眠时,自变量这种方式不能及时响应

但是 sleep 在唤醒的时候,还会做一件事,把刚才设置的这个标志位再设置回 false(清空了标志位)

这就导致,当 sleep 的异常被 catch 完了之后, 循环还要继续执行!!!

那么就是说,此时的flag并没有起作用。

因此,这里只是告诉让这个线程结束.这个线程是否要结束,啥时候结束都是线程内部自己代码来决定的。

2.使用Thread自带的标志

while(!Thread.currentThread().isInterrupted()){



t.interrupte就是终止t线程,main 线程调用t.interrupt()相当于main通知 t 你要终止了。

其实跟前面的flag差不过,只是把一个boolean操作封装到Thread的方法里面了。


interrupt会做两件事:

1.把线程内部的标志位(boolean)给设置成true。

2.如果线程在进行sleep,就会触发异常,把sleep唤醒。

但是sleep在唤醒的时候,还会做一件事,把刚才设置的这个标志位再设置回false.(清空了标志位)

这就导致,当sleep的异常被catch完了之后,循环还要继续执行。

那岂不是加不加这个interru都没用?反正遇到线程sleep的时候总是会继续运行?

此时我们可以在循环最后加一个break

 这样子线程t就会立刻响应你的终止请求。

等待线程

线程是一个随机调度的过程,等待线程,做的事情,就是在控制两个线程的结束顺序。

通过join来实现

 

 

 

 

 

 

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

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

相关文章

JavaWeb-Listener监听器

目录 监听器Listener 1.功能 2.监听器分类 3.监听器的配置 4.ServletContext监听 5.HttpSession监听 6.ServletRequest监听 监听器Listener 1.功能 用于监听域对象ServletContext、HttpSession和ServletRequest的创建,与销毁事件监听一个对象的事件&#x…

Python源码05:使用Pyecharts画词云图图

**Pyecharts是一个用于生成 Echarts 图表的 Python 库。Echarts 是一个基于 JavaScript 的数据可视化库,提供了丰富的图表类型和交互功能。**通过 Pyecharts,你可以使用 Python 代码生成各种类型的 Echarts 图表,例如折线图、柱状图、饼图、散…

Glide 的超时控制相关处理

作者:newki 前言 Glide 相信大家都不陌生,各种源码分析,使用介绍大家应该都是烂熟于心。但是设置 Glide 的超时问题大家遇到过没有。 我遇到了,并且掉坑里了,情况是这样的。 调用接口从网络拉取用户头像&#xff0c…

3.微服务概述

1.大型网络架构变迁 SOA与微服务最大的差别就是服务拆分的细度,目前大多数微服务实际上是SOA架构,真正的微服务应该是一个接口对应一个服务器,开发速度快、成本高; 微服务SOA能拆分的就拆分是整体的,服务能放一起的都…

【计算机网络】13、ARP 包:广播自己的 mac 地址和 ip

机器启动时,会向外广播自己的 mac 地址和 ip 地址,这个即称为 arp 协议。范围是未经过路由器的部分,如下图的蓝色部分,范围内的设备都会在本地记录 mac 和 ip 的绑定信息,若有重复则覆盖更新(例如先收到 ma…

【Spring】深入理解 Spring 事务及其传播机制

文章目录 一、Spring 事务是什么二、Spring 中事务的实现方法2.1 Spring 编程式事务(手动)2.1.1 编程式事务的使用演示2.1.2 编程式事务存在的问题 2.2 Spring 声明式事务(自动)2.2.1 Transactional 作用范围2.2.2 Transactional …

腾讯云GPU服务器GN7实例NVIDIA T4 GPU卡

腾讯云GPU服务器GN7实例搭载1颗 NVIDIA T4 GPU,8核32G配置,系统盘为100G 高性能云硬盘,自带5M公网带宽,系统镜像可选Linux和Windows,地域可选广州/上海/北京/新加坡/南京/重庆/成都/首尔/中国香港/德国/东京/曼谷/硅谷…

安卓纯代码布局开发游戏二:Android Studio开发环境搭建

1.Android Studio下载: Download Android Studio & App Tools - Android Developers 2.安装 安装过程非常简单,找到下载包,一直点Next即可。 3.下载Android SDK 第一次进入Android Studio默认会先下载Android SDK,笔者下载的Android SDK存…

零售行业供应链管理核心KPI指标(三)

完美订单满足率和退货率 完美订单满足率有三个方面的因素影响:订单按时、足量、无损交货。通常情况下零售企业追求线上订单履行周期慢慢达到行业平均水平,就是交付的速度变快了,这个肯定是一件好事情,趋势越来越好。 同时&#…

欧拉公式

文章目录 欧拉公式e欧拉恒等式欧拉公式欧拉公式 推导2步骤1: 使用泰勒级数展开步骤2: 将 i x i x ix 代入 e x e^x ex 复平面上推导欧拉公式步骤1:复平面上的复数表示步骤2:定义复数的指数形式步骤3:求导步骤4:连接两种形式步骤…

星际争霸之小霸王之小蜜蜂(一)

目录 前言 一、安装pygame库 1、pygame库简介 2、在windows系统安装pygame库 二 、搭建游戏框架 1、创建游戏窗口 2、改变窗口颜色 总结 前言 大家应该都看过或者都听说过python神书“大蟒蛇”,上面有一个案例是《外星人入侵》,游戏介绍让我想起了上…

炫酷UI前端效果的CSS生成工具

提升设计人员和前端开发人员的工作 推荐炫酷UI前端效果的CSS生成工具1.Neumorphism2.带有渐变的图标3.Interactions4.大型数据库5.动画6.Mask7.动画按钮8. 自定义形状分隔线9.背景图案10. SVG波浪推荐炫酷UI前端效果的CSS生成工具 1.Neumorphism 地址:https://neumorphism.i…

【Nginx17】Nginx学习:目录索引、字符集与浏览器判断模块

Nginx学习:目录索引、字符集与浏览器判断模块 今天要学习的内容有几个还是大家比较常见的,所以学习起来也不会特别费劲。对于目录的默认页设置大家都不会陌生,字符集的设置也比较常见,而浏览器的判断这一块,可能有同学…

深入源码分析kubernetes informer机制(二)Reflector

[阅读指南] 这是该系列第二篇 基于kubernetes 1.27 stage版本 为了方便阅读,后续所有代码均省略了错误处理及与关注逻辑无关的部分。 文章目录 Reflector是什么整体结构工作流程list拉取数据缓存resync操作watch监听操作 总结 Reflector是什么 reflector在informer…

RocketMQ双主双从同步集群部署

🎈 作者:互联网-小啊宇 🎈 简介: CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作,擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

学习笔记十九:Pod常见的状态和重启策略

Pod常见的状态和重启策略 常见的pod状态第一阶段:第二阶段:扩展: pod重启策略测试Always重启策略正常停止容器内的tomcat服务非正常停止容器里的tomcat服务 测试never重启策略正常停止容器里的tomcat服务非正常停止容器里的tomcat服务 测试On…

Mac安装opencv后无法导入cv2的解决方法

前提条件:以下两个插件安装成功 pip install opencv-python pip install --user opencv-contrib-python 注:直接用pip install opencv-contrib-python如果报错,就加上“–user" 第一步: 设置–添加python解释器 第二步&am…

go语言恶意代码检测系统--对接前端可视化与算法检测部分

Malware Detect System 1 产品介绍 恶意代码检测系统。 2 产品描述 2.1 产品功能 功能点详细描述注册账号未注册用户注册成为产品用户,从而具备享有产品各项服务的资格登录账号用户登录产品,获得产品提供的各项服务上传恶意样本用户可以将上传自己的…

uniapp微信小程序消息订阅快速上手

一、微信公众平台小程序开通消息订阅并设置模板 这边的模板id和详细内容后续前后端需要使用 二、uniapp前端 需要是一个button触发 js: wx.getSetting({success(res){console.log(res)if(res.authSetting[scope.subscribeMessage]){// 业务逻辑}else{uni.request…

智安网络|深入比较:Sass系统与源码系统的差异及选择指南

随着前端开发的快速发展,开发人员需要使用更高效和灵活的工具来处理样式表。在这个领域,Sass系统和源码系统是两个备受关注的选项。 Sass系统 Sass(Syntactically Awesome Style Sheets)是一种CSS预处理器,它扩展了CS…