Java:Thread类

news2024/12/22 19:24:38

Thread的常见构造方法

在这里插入图片描述

Thread的常见属性

在这里插入图片描述

  • ID 是线程的唯一标识,不同线程不会重复
  • 名称是在使用各种调试工具时会用到的
  • 状态表示线程当前所处的情况
  • 优先级高的线程理论上来说更容易被调度到
  • 关于后台线程,需要记住:JVM会在一个进程的所有非后台线程结束后,才会结束运行
  • 是否存活,即run方法是否运行结束,为true表示内核的线程存在,为false表示内核的线程无了

代码中创建的new Thread 对象的生命周期和内核中实际的线程的生命周期是不一定一样的.可能会出现Thread对象存在,但是内核中的线程不存在了这样的情况(但是不会出现Thread对象不存在,线程还存在这种).比如在调用start之前,内核中还没有创建线程呢~再比如线程的run执行完毕了,内核中的线程就无了,但是Thread对象仍然存在.

后台线程 & 前台线程

后台线程: 如果这个线程执行过程中,不能阻止进程结束,这样的线程就是"后台线程"(也叫做守护线程).

  1. 进程要结束(前台线程要结束),我无力阻止
  2. 后台线程先结束了,不影响进程的结束(其他前台线程的结束)

前台线程: 如果某个线程在执行的过程中,能够阻止进程结束,此时这个线程就是"前台线程"

  1. 前台线程宣布结束,此时进程就结束,后台线程也会随之结束
  2. 前台线程不宣布结束,后台线程结束了也不影响.

线程的核心操作

创建线程

一个经典的面试题: start 和 run 的差别

  • run: 描述了线程要执行的任务,也可以称为"线程的入口".
  • start: 调用系统函数,真正在系统内核中创建线程(创建PCB,加入到链表中)

调用start,不一定非得是main线程调用,任何的线程都可以创建其他线程; 一个Thread对象,只能调用一次start,如果多次调用start就会出现问题(一个Thread对象,只能对应系统中的一个线程)

线程的终止

假如有两个线程: A 和 B, B 正在运行,A想让B结束.
其实核心就是A要想办法让B的run方法执行完毕,此时B就自然结束了.而不是说,B的run执行一半,A直接把B强制结束了.

Java 中,结束线程是一个更"温柔"的过程,不是直接粗暴的,主要就是怕,B的某个工作执行了一半被强制结束,此时B对应的结果数据是一个"半成品".不是我们想要的.

怎么用代码实现线程的终止呢?
答: interrupted

public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            // 先获取到线程的引用
           Thread currentThread = Thread.currentThread();

           while (!currentThread.isInterrupted()) {
               System.out.println("hello thread");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   return;
               }
           }
        });

        t.start();
        Thread.sleep(3000);

        // 在主线程中,控制t线程终止,设置标志位
        t.interrupt();
    }

Thread类里有一个成员,就是interrupted ,它是boolean 类型的.初始情况下是false,未被终止.

需要注意的是:

  1. interrupt 方法能够设置标志位,也能够唤醒sleep等阻塞方法.但是要先获取到线程的引用.
  2. sleep 被唤醒之后,会把标志位清空.

为啥要这么做呢?
答: 给程序员更多的操作空间.

  1. 如果B线程想无视A,就直接在catch中啥都不做,此时B线程仍然会执行
  2. 如果B线程想立即结束,就直接在catch中写上return或者break,此时B线程就会立即结束
  3. 如果B线程想稍后结束,就可以在catch中写上一些其他的逻辑(比如 释放资源,清理一些数据,提交一些结果…收尾工作),等这些逻辑完成后,再进行return / break.

本文到这里就结束啦~

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

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

相关文章

基于python做镜像文件

用python制作网页镜像文件 第一步&#xff1a;初始化操作&#xff0c;用可用镜像源&#xff1a; mkdir -p /etc/docker tee /etc/docker/daemon.json <<-EOF { "registry-mirrors": ["https://hub.docker-alhk.dkdun.com/"] } EOF systemctl daemon…

攻击者劫持 Facebook 页面用于推广恶意 AI 照片编辑器

近日&#xff0c;有攻击者劫持了 Facebook 上的网页&#xff0c;诱骗用户下载一个合法的人工智能&#xff08;AI&#xff09;照片编辑器&#xff0c;但实际上他们真正下载的却是一个专门用以盗取用户的凭据信息窃取程序。 趋势科技的研究人员发现的这一恶意广告活动利用了人工…

ModuleNotFoundError: No module named ‘tqdm‘

报错信息&#xff1a; tqdm是一个快速、可扩展的Python进度条库&#xff0c;用于展示迭代器的长循环执行进度。 解决&#xff1a;通过以下命令安装 使用conda命令安装 conda install tqdm使用pip安装&#xff1a; pip install tqdm

临床数据科学中有关试验设计的四个关键要素

临床数据科学是现代医学研究中不可或缺的组成部分&#xff0c;通过科学的方法和统计分析工具来揭示医疗数据背后的规律和真相。试验设计是临床数据科学的核心环节&#xff0c;直接关系到研究结果的可靠性和科学性。 在过去几十年中&#xff0c;随机临床试验&#xff08;Randomi…

CNN卷积网络实现MNIST数据集手写数字识别

步骤一&#xff1a;加载MNIST数据集 train_data MNIST(root./data,trainTrue,downloadFalse,transformtransforms.ToTensor()) train_loader DataLoader(train_data,shuffleTrue,batch_size64) # 测试数据集 test_data MNIST(root./data,trainFalse,downloadFalse,transfor…

Project #0 - C++ Primer

知识点 1.pragma once C和C中的一个非标准但广泛支持的预处理指令&#xff0c;用于使当前源文件在单次编译中只被包含一次。 #pragma once class F {}; // 不管被导入多少次&#xff0c;只处理他一次2.explicit C中的一个关键字&#xff0c;它用来修饰只有一个参数的类构造函…

遇到突发事故,您是否能够应对自如?

近期发生的全球性大规模系统技术故障为我们敲响了警钟——仅仅依赖一朵公共云服务存在其固有的脆弱性。全球多地视窗系统因一款安全软件更新而宕机&#xff0c;出现“蓝屏”&#xff0c; 航空、医疗、传媒、金融、零售、物流等多个行业均受影响。这一事件凸显了对强大、多元化云…

forwardRef和useImperativeHandle到底能做啥

线上个官网例子 App.js import { useRef } from react; import MyInput from ./MyInput.js;export default function Form() {const ref useRef(null);function handleClick() {ref.current.focus();// This wont work because the DOM node isnt exposed:// ref.current.sty…

2024年必备技能:智联招聘岗位信息采集技巧全解析

随着大数据时代的发展&#xff0c;精准定位职业机会成为程序员求职的关键。本文将深入解析如何利用Python高效采集智联招聘上的岗位信息&#xff0c;助你在2024年的职场竞争中脱颖而出。通过实战代码示例&#xff0c;揭示网络爬虫背后的秘密&#xff0c;让你轻松掌握这一必备技…

【算法】双指针-OJ题详解1

双指针-OJ题 移动零&#xff08;点击跳转&#xff09;原理讲解代码实现 复写零&#xff08;点击跳转&#xff09;原理讲解代码实现 快乐数&#xff08;点击跳转&#xff09;原理讲解代码实现 盛最多水的容器&#xff08;点击跳转&#xff09;原理讲解代码实现 有效三角形的个数…

模式植物构建orgDb数据库 | 以org.Slycompersicum.eg.db为例

原文链接:模式植物构建orgDb数据库 | 以org.Slycompersicum.eg.db为例 本期教程 一步构建模式植物OrgDb数据库 source("../Set_OrgDb_Database.R")# 使用函数 Set_OrgDb_Database(emapper_file "out.emapper_tomato.csv", ## 输入的eggnog结果文件json_…

使用 MinIO、Langchain 和 Ray Data 构建分布式嵌入式子系统

嵌入子系统是实现检索增强生成所需的四个子系统之一。它将您的自定义语料库转换为可以搜索语义含义的向量数据库。其他子系统是用于创建自定义语料库的数据管道&#xff0c;用于查询向量数据库以向用户查询添加更多上下文的检索器&#xff0c;最后是托管大型语言模型 &#xff…

Stream 33

package Array.collection;import java.util.*; import java.util.stream.Stream;public class stream1 {public static void main(String[] args) {//、如何茯取List集合的Stream流?List<String> names new ArrayList<>();Collections. addAll(names,"方法…

超声波眼镜清洗机哪个品牌好?四款高性能超声波清洗机测评剖析

对于追求高生活质量的用户来说&#xff0c;眼镜的清洁绝对不能马虎。如果不定期清洁眼镜&#xff0c;时间久了&#xff0c;镜片的缝隙中会积累大量的灰尘和细菌&#xff0c;眼镜靠近眼部&#xff0c;对眼部健康有很大影响。在这种情况下&#xff0c;超声波清洗机显得尤为重要。…

现象:程序没问题,compile成功,在load时,提示prg.dll没找到

现象:程序没问题&#xff0c;compile成功&#xff0c;在load时&#xff0c;提示prg.dll没找到 解决方法&#xff1a;使用新的ATE电脑主机&#xff0c;导致的问题&#xff0c;又换回原来的电脑主机&#xff0c;问题解决。

数据结构与算法--【链表1】力扣练习 || 链表 / 移除链表元素

声明&#xff1a;本文参考代码随想录。 一、链表定义 1、概念 将线性表L(a0,a1,……,an-1)中各元素分布在存储器的不同存储块&#xff0c;称为结点&#xff0c;通过地址或指针建立元素之间的联系。 每一个结点由两部分组成&#xff1a;数据域和指针域。结点的data域存放数据…

第三届Apache Flink 极客挑战赛暨AAIG CUP比赛攻略_大浪813团队

关联比赛: 第三届 Apache Flink 极客挑战赛暨AAIG CUP——电商推荐“抱大腿”攻击识别 第三届Apache Flink 极客挑战赛暨AAIG CUP比赛攻略_大浪813团队 第三届Apache Flink 极客挑战赛暨AAIG CUP 自2021年8月17日上线以来已有 4537 个参赛队伍报名。11月09号&#xff0c;大赛…

Android入门之路 - WebView加载数据的几种方式

之前客户端加载H5时遇到了一些问题&#xff0c;我为了方便解决问题&#xff0c;所以将对应场景复刻到了Demo中&#xff0c;从之前的网络加载模拟为了本地加载Html的方式&#xff0c;但是没想到无意被一个基础知识点卡了一些时间&#xff0c;翻看往昔笔记发现未曾记录这种基础场…

C语言初阶(10)

1.野指针 野指针就是指向未知空间的指针&#xff0c;有以下几种情况 &#xff08;1)指针未初始化 int main() {int a0;int*b;return 0; } 上面指针就是没有初始化&#xff0c;形成一种指向一个随机空间的地址的指针&#xff0c;我们可以修改成 int main() {int a0;int*bNU…

甘肃雀舌面:舌尖上的独特韵味

雀舌面&#xff0c;顾名思义&#xff0c;其面条形状如同雀舌般小巧精致。这一独特的形态并非偶然所得&#xff0c;而是源于精湛的手工技艺。制作雀舌面&#xff0c;对面粉的选择和面团的揉制有着极高的要求。经验丰富的师傅会精心挑选优质面粉&#xff0c;加入适量的水&#xf…