线程中的核心操作

线程中的核心操作

  • 1:start()
  • 2:中断(终止)一个线程
    • 2.1:自己定义线程结束的代码
      • 2.1.1 存在的问题
    • 2.2:使用Thread提供的interrupt()方法和isInterrupted()
      • 2.2.1 继续执行
      • 2.2.2 立即结束
      • 2.2.3 打印异常信息,再立即结束
      • 2.2.1 继续执行
    • 2
    • 2
      • 三级目录

1:start()

start() 真正的创建线程,(在内核中创建PCB,然后添加到链表中).
一个线程需要先通过run/lambda表达式,把先要完成的任务定义出来,start()才是真正创建线程,并开始执行.
核心:是否真的创建线程出俩,每个线程都是独立调度执行的,(相当于整个程序中多了一个执行流)
一个Thread对象,也是只能start()一次的,如果想要再创建一个线程,需要再创建另一个Thread对象.

public class Test4 {public static void main(String[] args) {Thread thread=new Thread(()->{System.out.println("hello thread");});thread.start();thread.start();}
}

上述代码会抛异常.
在这里插入图片描述

正确写法应该是创建两个Thread对象,然后再分别start();

public class Test4 {public static void main(String[] args) {Thread thread=new Thread(()->{System.out.println("hello thread");});Thread thread2=new Thread(()->{System.out.println("hello     thread2");});thread.start();thread2.start();}}

2:中断(终止)一个线程

终止一个线程,在Java中,都只是"提醒,建议",真正要不要终止,还是由线程本体来决定.
比如:t线程正在执行,其他线程,只是提醒一下t是不是要终止了,t收到这样的提醒后,也还是根据自己的代码觉得是否要终止.

2.1:自己定义线程结束的代码

核心思路:需要让终止的线程的入口的方法尽快执行结束,(跳出循环,尽快return 都可以).

public class Demo1 {public  static  boolean flg=true;public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(()->{while(flg){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});thread.start();for (int i = 0; i < 3; i++) {System.out.println("hello main");Thread.sleep(1000);}flg=false;Thread.sleep(1000);System.out.println(thread.isAlive());}
}

在这里插入图片描述

2.1.1 存在的问题

上面的代码,有一个很明显的缺陷,那就是当main线程中执行到flg=false的时候,如果thread线程刚好处于阻塞状态,那么只能阻塞状态结束, 才能终止线程.
如果sleep()的时间比较长,那么代码的效率就比较低了.

2.2:使用Thread提供的interrupt()方法和isInterrupted()

public class Demo2 {public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(()->{while(!Thread.currentThread().isInterrupted())    {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});thread.start();for (int i = 0; i <3 ; i++) {System.out.println("hello main");Thread.sleep(1000);}thread.interrupt();}
}

currentThread():这个方法能够获取到当前线程,也就是能够获取到thread 这个引用.

isInterrupted();是线程内置的标志位,true表示这个线程要终止了,false 表示这个线程要继续执行.
thread.interrupt();通过这个方法,就相当于将标志位设置为true,同时,还可以唤醒sleep()等阻塞的方法.
有sleep()的时候,当触发Interrupt的时候,线程正在sleep,sleep被唤醒的同时,就会清除掉刚才的标志位(又改为false).
之所以要改回去,就是把控制权,交给程序员自己,当前线程是否要继续执行?,还是要立即结束?还是要等结束?让程序员自己写代码来决定.

2.2.1 继续执行

public class Demo2 {public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(()->{while(!Thread.currentThread().isInterrupted())    {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});thread.start();for (int i = 0; i <3 ; i++) {System.out.println("hello main");Thread.sleep(1000);}thread.interrupt();}
}

在这里插入图片描述

2.2.2 立即结束

public class Demo2 {public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(()->{while(!Thread.currentThread().isInterrupted())    {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {break;}}});thread.start();for (int i = 0; i <3 ; i++) {System.out.println("hello main");Thread.sleep(1000);}thread.interrupt();}
}

2.2.3 打印异常信息,再立即结束

public class Demo2 {public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(()->{while(!Thread.currentThread().isInterrupted())    {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();break;}}});thread.start();for (int i = 0; i <3 ; i++) {System.out.println("hello main");Thread.sleep(1000);}thread.interrupt();}
}

在这里插入图片描述

2.2.1 继续执行

2

2

三级目录

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

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

相关文章

数据资产的计量方式和后续计量如何确定?

对与数据资产的计量&#xff0c;可分为初始计量和后续计量两大环节来考虑。 一、在初始计量环节可采用按历史成本法计量和按公允价值计量两种方式 目前数据资产的计量属性主要包含历史成本、公允价值。企业数据资产可考虑从用途角度划分为内部开发型和外购型。 &#xff08;…

Android TargetSdkVersion 30 安装失败 resources.arsc 需要对齐且不压缩。

公司项目&#xff0c;之前targetSDKVersion一直是29&#xff0c;近期小米平台上架强制要求升到30&#xff0c;但是这个版本在android12上安装失败&#xff0c;我用adb命令安装&#xff0c;报错如下图 adb: failed to install c: Program Files (x86)(0A_knight\MorkSpace \Home…

Springboot构建测试类Test出现错误:Test class should have exactly one public constructor

&#xff08;1&#xff09;在SpringBoot中&#xff0c;分为Spring4和Spring5&#xff08;或Spring5以上版本&#xff09;&#xff0c;Spring4的Test测试类需要加上两个注解&#xff1a; SpringBootTest RunWith(SpringRunner.class) 导入的包是: import org.junit.Test; &am…

App地推统计神器,Xinstall让数据说话

App地推&#xff0c;作为移动应用推广的重要手段&#xff0c;一直以来都备受关注。然而&#xff0c;随着移动工具App进入存量时代&#xff0c;用户粘性降低&#xff0c;行业竞争日益激烈&#xff0c;地推的效果评估和提升成为了开发者们亟待解决的问题。在这个背景下&#xff0…

[C++初阶] 爱上C++ : 与C++的第一次约会

&#x1f525;个人主页&#xff1a;guoguoqiang &#x1f525;专栏&#xff1a;我与C的爱恋 本篇内容带大家浅浅的了解一下C中的命名空间。 在c中&#xff0c;名称&#xff08;name&#xff09;可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大&#xff0c;名称…

Flink CDC 同步数据到Doris

Flink CDC 同步数据到Doris Flink CDC 是基于数据库日志 CDC(Change Data Capture)技术的实时数据集成框架,支持了全增量一体化、无锁读取、并行读取、表结构变更自动同步、分布式架构等高级特性。配合 Flink 优秀的管道能力和丰富的上下游生态,Flink CDC 可以高效实现海量…

服务端业务设计及源码

本篇有点长&#xff0c;并且包含源码&#xff0c;希望可以结合文章注释看源码&#xff0c;可以通过目录进行跳转 目录 一、服务端主要功能划分 二、服务端模块划分 三、文件工具模块的实现 文件工具类需要实现的功能&#xff1a; 1.构造函数、获取文件名的实现 2.获取文…

【C语言】——指针六:冒泡排序与qsort函数的实现

【C语言】——指针六&#xff1a;冒泡排序与qsort函数 一、冒泡排序1.1、冒泡排序的原理1.2、用代码实现冒泡排序 二、qsort函数2.1、qsort函数的定义2.2、 qosrt函数的使用&#xff08;1&#xff09;比较函数的写法&#xff08;2&#xff09;使用 q s o r t qsort qsort 函数…

FPGA Artix7 Bootloader App Python升级

文章目录 软硬环境复现官方 srec_spi_bootloader例子简介Vivado硬件部分存储划分Vitis 嵌入式 BootVitis 嵌入式 Appelf转换srec合并boot和app得到mcs文件下载测试过程分析 基础知识BIT MCS HEX BINBit SwappingSREC 文件格式Vivado约束 串口Boot地址划分链接脚本修改Github Li…

三个对象组练习.java

题目&#xff1a;定义数组存储3部汽车对象&#xff1b;汽车属性&#xff1a;品牌&#xff0c;价格&#xff0c;颜色&#xff1b;创造3个汽车对象&#xff0c;数据通过键盘录入而来&#xff0c;并把数据存储到数组当中 分析&#xff1a; 在main&#xff08;&#xff09;里面定义…

使用Zabbix监控NAS目录状态

在企业的数据存储和共享中,网络附加存储(NAS)扮演着至关重要的角色。为了确保NAS设备的稳定运行和数据的完整性,对其进行实时监控是必不可少的。Zabbix作为一款开源的网络监控解决方案,能够帮助我们实现这一目标。本文将介绍如何使用Zabbix监控NAS目录状态,以确保及时发现…

HarmonyOS实战开发-如何构建多种样式弹窗

介绍 本篇Codelab将介绍如何使用弹窗功能&#xff0c;实现四种类型弹窗。分别是&#xff1a;警告弹窗、自定义弹窗、日期滑动选择器弹窗、文本滑动选择器弹窗。需要完成以下功能&#xff1a; 点击左上角返回按钮展示警告弹窗。点击出生日期展示日期滑动选择器弹窗。点击性别展…

蓝桥杯算法题练习

1、20世纪有多少个星期一 &#xff08;1901、1、1——2000、12、31&#xff09; 方法一&#xff1a;python代码 方法二&#xff1a;excel工具(设置单元格格式&#xff0c;把日期换成周几的形式) 2、100个数相乘&#xff0c;结果有几个0 3、切面条 找规律:对折次数n 弯2^n-1 面…

分享几个以前画过的pcb,确实能看到进步

本文来自看海原创视频教程&#xff1a;《运放秘籍》运算放大器基础精讲及应用第一部*开天 微信公众号&#xff1a;工程师看海 【淘宝】https://m.tb.cn/h.5PAjLi7?tkvmMLW43KO7q CZ3457 「运放秘籍_运算放大器Multisim仿真视频教程第一部开天_工程师看海」 点击链接直接打开 …

ssm婚纱摄影管理系统的设计+1.2w字论文+免费调试

项目演示视频&#xff1a; ssm婚纱摄影管理系统的设计 项目介绍: 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多商家的之中&#xff0c;随之就产生了“婚纱摄影网的设计”&#xff0c;这样就让婚纱摄影网的设计更…

关于Kubernetes-v1.23.6-资源调度-StatefulSet-OnDelete当删除的时候才更新

前面提到的普通的滚动更新&#xff0c;都是修改完sts立即就会发生更新操作 而还有一种更新的策略为&#xff0c; OnDelete&#xff0c;即只有在 pod 被删除时会进行更新操作 还是先看一下web这个sts的当前更新策略如下&#xff1a; 这里我们修改&#xff0c;更新策略&#xf…

单目图像加单点测距,求解目标位姿

单目图像加单点测距&#xff0c;求解目标位 附赠自动驾驶学习资料和量产经验&#xff1a;链接 单目相机通过对极约束来求解相机运动的位姿。参考了ORBSLAM中单目实现的代码&#xff0c;这里用opencv来实现最简单的位姿估计。 对极约束的概念可以参考我的这篇 Visual SLAM –…

SpringBoot分布式锁自定义注解处理幂等性

SpringBoot分布式锁自定义注解处理幂等性 注解简介 注解&#xff08;Annotation&#xff09;是Java SE 5.0 版本开始引入的概念&#xff0c;它是对 Java 源代码的说明&#xff0c;是一种元数据&#xff08;描述数据的数据&#xff09;。 Java中的注解主要分为以下三类: JDK…

如何制作透明文件夹?

哇&#xff01;是不是很羡慕&#xff1f; 保姆级教程来啦&#xff01; 我们先新建一个文件夹 这么辛苦写文章&#xff0c;可以给我点个关注么~

C++ —— C++11新增语法

目录 一&#xff0c;列表初始化 1.1 这是什么&#xff1f; 1.2 initializer_list 1.3 在容器的运用 1.4 STL中的变化 二&#xff0c;右值引用和左值引用 2.1 是什么&#xff1f; 2.2 这两个东西有啥关系&#xff1f; 2.3 有啥用&#xff1f; 三&#xff0c;*移动构…