java线程学习

java线程崩溃,只会终止该线程,不会影响其他线程,主线程崩溃也不影响子线程的执行。
在安卓中,无论主线程还是子线程崩溃,都会导致应用程序退出。

Thread userThread = new Thread(() -> {
           System.out.println("用户线程启动");
           try {
               for (int i = 0; i < 5; i++) {
                   System.out.println("用户线程运行: " + i);
                   Thread.sleep(1000);
              }
          } catch (InterruptedException e) {
               Thread.currentThread().interrupt();
               System.out.println("用户线程被中断");
          }
           System.out.println("用户线程结束");
      });
       userThread.start();

这段代码创建并启动了一个新的线程(称为userThread),该线程执行以下操作:

  1. 启动信息打印:首先打印出一条消息 “用户线程启动” 到控制台,表明用户线程已经开始执行。
  2. 循环执行与休眠:然后,它进入一个循环,循环变量i从0开始,小于5时循环继续。在每次循环中,它首先打印出当前循环的计数 "用户线程运行: " + i,然后调用Thread.sleep(1000);使当前线程(即userThread)暂停执行1秒钟。这样做是为了模拟线程在执行过程中可能会进行的耗时操作或等待。
  3. 异常处理:如果在Thread.sleep(1000);调用过程中,userThread被其他线程中断(比如通过调用其interrupt()方法),则会抛出InterruptedException。该异常被捕获,并在捕获块中执行两个操作:
    首先,通过调用Thread.currentThread().interrupt();重新设置当前线程的中断状态。这是因为在捕获InterruptedException后,JVM会清除线程的中断状态,如果后续代码还需要检查线程是否被中断,就需要重新设置这个状态。
    然后,打印出"用户线程被中断"到控制台,表明userThread在执行过程中被中断了。
  4. 结束信息打印:无论循环是否因为正常完成还是被中断而结束,最后都会打印出"用户线程结束"到控制台,表明userThread的执行已经完成。
    启动线程:通过调用userThread.start();,上述定义的线程(userThread)被启动。在start()方法被调用之前,线程只是处于新建状态,并不会执行其Runnable(或实现了Runnable接口的匿名内部类)中的代码。一旦start()方法被调用,JVM就会为userThread分配必要的资源,并使其开始执行Runnable中的代码。

需要注意的是,虽然这里使用了Lambda表达式来创建实现了Runnable接口的匿名内部类实例,但实质上,这段代码做的事情与显式地创建实现了Runnable接口的类并实例化该类的实例,然后将其实例传递给Thread的构造函数是相同的。

Thread.currentThread().interrupt(); 这段代码的作用是让当前正在执行的线程(在这个上下文中,是 userThread)中断自己。这里的 currentThread() 方法返回对当前正在执行的线程对象的引用,因此 Thread.currentThread().interrupt(); 实际上是在调用 userThread 的 interrupt() 方法,从而设置 userThread 的中断状态。

重要的是要理解,中断(interrupting)一个线程并不会立即停止该线程的执行。中断只是设置了一个标志,告诉线程它应该停止正在做的事情,并适当地进行清理。线程本身需要检查这个中断状态(通过调用 Thread.interrupted(),这会清除中断状态,或者通过 Thread.currentThread().isInterrupted(),这不会清除中断状态),并据此决定是否退出或执行其他操作。

在例子中,userThread 在 Thread.sleep(1000); 调用期间可能会被中断(如果其他线程调用了 userThread.interrupt())。如果发生了这种情况,Thread.sleep(1000); 会抛出一个 InterruptedException。在 catch 块中,调用了 Thread.currentThread().interrupt(); 来重新设置中断状态,但这只是为了确保如果后续还有代码需要检查中断状态,它们能够知道线程已经被中断过。这通常是一个好习惯,因为一旦捕获了 InterruptedException,中断状态就会被清除。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三种蓝牙架构实现方案

一、蓝牙架构方案 1、hostcontroller双芯片标准架构 手机里面包含很多SoC或者模块&#xff0c;每颗SoC或者模块都有自己独有的功能&#xff0c;比如手机应用跑在AP芯片上&#xff0c;显示屏&#xff0c;3G/4G通信&#xff0c;WiFi/蓝牙等都有自己专门的SoC或者模块&#xff0…

sql工具!好用!爱用!

SQLynx的界面设计简洁明了&#xff0c;操作逻辑清晰易懂&#xff0c;没有复杂的图标和按钮&#xff0c;想对哪部分操作就在哪里点击右键&#xff0c;即使你是数据库小白也能轻松上手。 尽管SQLynx是一款免费的工具&#xff0c;但是它的功能却丝毫不逊色于其他付费产品&#xff…

UE5肉鸽游戏教程学习

学习地址推荐&#xff1a;UE5肉鸽项目实战教程_哔哩哔哩_bilibili

反向代理服务器的用途

代理服务器在网络中扮演着重要的角色&#xff0c;它们可以优化流量、保护服务器以及提高安全性。在代理服务器中&#xff0c;反向代理服务器是一种特殊类型&#xff0c;常用于Web服务器前&#xff0c;它具备多种功能&#xff0c;能够确保网络流量的顺畅传输。那么&#xff0c;让…

面试经典 150 题:205,55

205. 同构字符串 【解题思路】 来自大佬Krahets 【参考代码】 class Solution { public:bool isIsomorphic(string s, string t) {map<char, char> Smap, Tmap;for(int i0; i<s.size(); i){char a s[i], b t[i];//map容器存在该字符&#xff0c;且不等于之前映射…

信创改造 - TongRDS 替换 Redis

记得开放 6379 端口哦 1&#xff09;首先在服务器上安装好 TongRDS 2&#xff09;替换 redis 的 host&#xff0c;post&#xff0c;passwd 3&#xff09;TongRDS 兼容 jedis # 例如&#xff1a;更改原先 redis 中对应的 host&#xff0c;post&#xff0c;passwd 改成 TongRDS…

嵌入式工程师面试笔试总结——day1

第一章、进程与线程 1、什么是进程、线程&#xff0c;有什么区别&#xff1f; 进程是资源&#xff08; CPU 、内存等&#xff09;分配的基本单位&#xff0c;线程是 CPU 调度和分配的基本单位&#xff08;程序执行的最小单 位&#xff09;。同一时间&#xff0c;如果CPU 是单…

算法之区间和题目讲解

题干 难度&#xff1a;简单 题目分析 题目要求算出每个指定区间内元素的总和。 然而&#xff0c;区间在输入的最下面&#xff0c;所以按照暴力破解的思路&#xff0c;我们首先要遍历数组&#xff0c;把它的值都存进去。 然后&#xff0c;遍历下面的区间&#xff0c;从索引a…

泷羽sec-linux

基础之linux 声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…

用 Python 从零开始创建神经网络(十):优化器(Optimizers)(持续更新中...)

优化器&#xff08;Optimizers&#xff09; 引言1. 随机梯度下降/Stochastic Gradient Descent (SGD)2. 学习率&#xff08;Learning Rate&#xff09;3. 学习率衰减&#xff08;Learning Rate Decay&#xff09;4. 带动量的随机梯度下降法&#xff08;Stochastic Gradient Des…

UE5安装教程及设置

学习链接&#xff1a;01-安装UE5及设置_哔哩哔哩_bilibili

如何利用Python爬虫精准获得1688店铺的所有商品信息

在数字化时代&#xff0c;数据的价值日益凸显&#xff0c;尤其是在电商领域。1688作为中国领先的B2B电商平台&#xff0c;拥有丰富的商品数据。对于电商企业来说&#xff0c;获取这些数据对于市场分析、竞品研究等具有重要意义。本文将详细介绍如何使用Python编写爬虫程序&…

电子学习中的关键游戏化元素

游戏化彻底改变了电子学习领域&#xff0c;提供了一种使学习具有吸引力、互动性和有效性的方法。通过将类似游戏的功能集成到教育平台中&#xff0c;教育工作者可以增强动力&#xff0c;提高知识记忆&#xff0c;并创造动态的学习体验。游戏化的关键要素为设计与学习者产生共鸣…

docker镜像、容器、仓库介绍

docker docker介绍docker镜像命令docker容器命令docker仓库 docker介绍 官网 Docker 是一种开源的容器化平台&#xff0c;用于开发、部署和运行应用。它通过将应用程序及其依赖项打包到称为“容器”的单一包中&#xff0c;使得应用能够在任何环境下运行&#xff0c;不受底层系…

一些好的AI技术学习平台和资料(动态更新)

1. 大模型 1.1 提示词&#xff08;Prompt&#xff09; 目前&#xff0c;大模型技术已经深入到工作生活的方方面面&#xff0c;各技术大厂的大模型也层出不穷&#xff0c;从开始的OpenAI一家独大&#xff0c;到当今世界的“百模大战”。从一些日常使用的角度来说&#xff0c;模…

IDEA优雅debug

目录 引言一、断点分类&#x1f384;1.1 行断点1.2 方法断点1.3 属性断点1.4 异常断点1.5 条件断点1.6 源断点1.7 多线程断点1.8 Stream断点 二、调试动作✨三、Debug高级技巧&#x1f389;3.1 watch3.2 设置变量3.3 异常抛出3.4 监控JVM堆大小3.5 数组过滤和筛选 引言 使用ID…

QT简易项目 数据库可视化界面 数据库编程SQLITE QT5.12.3环境 C++实现

案例需求&#xff1a; 完成数据库插入&#xff0c;删除&#xff0c;修改&#xff0c;查看操作。 分为 插入&#xff0c;删除&#xff0c;修改&#xff0c;查看&#xff0c;查询 几个模块。 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget…

丹摩征文活动|实现Llama3.1大模型的本地部署

文章目录 1.前言2.丹摩的配置3.Llama3.1的本地配置4. 最终界面 丹摩 1.前言 Llama3.1是Meta 公司发布的最新开源大型语言模型&#xff0c;相较于之前的版本&#xff0c;它在规模和功能上实现了显著提升&#xff0c;尤其是最大的 4050亿参数版本&#xff0c;成为开源社区中非常…

MySQL与Informix数据库中的同义表创建:深入解析与比较

MySQL与Informix数据库中的同义表创建:深入解析与比较 一、同义表的基本概念与用途1. 定义与概念2. 主要用途二、MySQL数据库中的同义表创建1. 使用视图创建同义表2. 使用别名创建同义表3. MySQL中的同义表限制与替代方案三、Informix数据库中的同义表创建1. 创建同义表的基本…

【LeetCode面试150】——202快乐数

博客昵称&#xff1a;沈小农学编程 作者简介&#xff1a;一名在读硕士&#xff0c;定期更新相关算法面试题&#xff0c;欢迎关注小弟&#xff01; PS&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟沈小农&#xff0c;希望我的文章能帮助到你。欢迎大家在…