线程中的核心操作

news2024/11/29 4:50:18

线程中的核心操作

  • 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://www.coloradmin.cn/o/1556284.html

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

相关文章

LeetCode Python - 80. 删除有序数组中的重复项 II

目录 题目描述解法运行结果 题目描述 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O…

奔赴智慧医院建设浪潮,迈瑞创新产品亮相中国医学装备大会

3月28日&#xff0c;第32届中国医学装备大会暨2024医学装备展览会在重庆顺利开展。迈瑞医疗以“助力医院高质量发展&#xff0c;共建智慧医院生态”为主题参展&#xff0c;多款核心零部件、创新产品及智慧医疗生态集体亮相。 满足需求&#xff0c;推动智慧医院建设提速 迈瑞医疗…

天下三分明月夜,独有快慢指针法(链表面试题篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

什么是CVE? CVE漏洞应该如何防护?

CVE&#xff08;Common Vulnerabilities and Exposures&#xff09;的全称是公共漏洞和暴露&#xff0c;是公开披露的网络安全漏洞列表。IT人员、安全研究人员查阅CVE获取漏洞的详细信息&#xff0c;进而根据漏洞评分确定漏洞解决的优先级。 在CVE中&#xff0c;每个漏洞按CVE-…

Type-C一分二快充线智能分配方案

随着移动设备的普及和快充技术的迅猛发展&#xff0c;Type-C接口已成为众多手机、平板和笔记本电脑的标配。然而&#xff0c;在日常使用中&#xff0c;我们经常会遇到需要同时为多个设备充电的情况。这时&#xff0c;Type-C一分二快充线就显得尤为重要。为了更好地满足用户的充…

CSS之动画

一&#xff0c;动画的制作 实现盒子绕圈走 二&#xff0c; 动画的常用属性 三&#xff0c;动画简写属性 前面两个属性一定要写&#xff0c;第三个linear是指匀速的意思&#xff08;默认是ease&#xff09;

Day26 手撕各种集合底层源码(一)

Day26 手撕各种集合底层源码&#xff08;一&#xff09; 一、手撕ArrayList底层源码 1、概念&#xff1a; ArrayList的底层实现是基于数组的动态扩容结构。 2、思路&#xff1a; 1.研究继承关系 2.研究属性 3.理解创建集合的过程 – 构造方法的底层原理 4.研究添加元素的过程…

【Linux】图文详解Xshell远程连接服务器:以Amazon EC2 VPS为例

文章目录 问题描述解决方案Q&A 问题描述 本地cmd或powershell使用ssh -i “your.pem” user_nameip_address是可以登录Amazon EC2云服务器的。 然而&#xff0c;当使用XShell以SSH加载PEM文件方式登录亚马逊EC2云服务器&#xff0c;一直出现输入密码的问题&#xff0c;如…

FPGA亚稳态学习总结

首先是组合逻辑电路考虑的是竞争冒险&#xff0c;冒险会产生毛刺。重点研究如何去毛刺 时序逻辑电路考虑的是时序不满足会产生的亚稳态问题&#xff1a;如何考量时序满不满足呢&#xff1f;根据不同的场景又有不同的说法。 时序分析的两组基本概念 建立时间与保持时间 1.在…

使用Node.js常用命令提高开发效率

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;广泛用于构建服务器端应用程序和命令行工具。Node.js提供了丰富的命令和工具&#xff0c;可以帮助开发者更高效地开发应用程序。在日常开发中&#xff0c;除了Node.js本身的核心功能外&#xff0c;npm&#x…

加密/ 解密 PDF:使用Python为PDF文档设置、移除密码

在数字化时代&#xff0c;文档的安全性变得越来越重要。特别是对于包含敏感信息的PDF文件&#xff0c;确保其不被未经授权的人员访问或修改是至关重要的。本文将介绍如何使用Python在PDF文档中设置密码&#xff0c;以及如何移除已经设置的密码。 目录 PDF加密基础知识 Pytho…

QT 最近使用的项目配置文件

目录 1 QT 最近使用的项目配置文件所在路径 2 QtCreator.ini 1 QT 最近使用的项目配置文件所在路径 C:\Users\your username\AppData\Roaming\QtProject QtCreator.ini最好先备份一份 2 QtCreator.ini ProjectExplorer 下面的 RecentProjects\FileNames RecentProjects\…

【公示】2023年度青岛市级科技企业孵化器拟认定名单

根据《青岛市科技企业孵化器管理办法》&#xff08;青科规〔2023〕1号&#xff09;&#xff08;以下简称《管理办法》&#xff09;、《关于开展2023年度市级科技企业孵化器认定申报工作的通知》&#xff0c;经申报受理、区市推荐、形式审查、专家评审及现场核查等程序&#xff…

十七、InnoDB 一次更新事务的执行过程

一、InnoDB的一次更新事务是怎么实现的&#xff1f; InnoDB的一次更新事务涉及到多个组件和步骤&#xff0c;包括Buffer Pool、BinLog、UndoLog、RedoLog以及物理磁盘。 下面是一次完整的事务更新操作过程&#xff1a; 1. 加载数据到缓存中&#xff08;Buffer Pool&#xff0…

HTML5通过api实现拖放效果 dataTransfer对象

dataTransfer对象 说明&#xff1a;dataTransfer对象用于从被拖动元素向放置目标传递字符串数据。因为这个对象是 event 的属性&#xff0c;所以在拖放事件的事件处理程序外部无法访问 dataTransfer。在事件处理程序内部&#xff0c;可以使用这个对象的属性和方法实现拖放功能…

【实现报告】学生信息管理系统(链表实现)

目录 实验一 线性表的基本操作 一、实验目的 二、实验内容 三、实验提示 四、实验要求 五、实验代码如下&#xff1a; &#xff08;一&#xff09;链表的构建及初始化 学生信息结构体定义 定义元素类型 链表节点结构体定义 初始化链表 &#xff08;二&#xff09;…

【AI】命令行调用大模型

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 【AI】命令行调用大模型引入正文初始化项目撰写脚本全局安装 成果展示 【AI】命令…

Linux——共享内存

Linux——共享内存 什么是共享内存共享内存原理Linux下共享内存的接口创建/获取共享内存&#xff1a;shmgetftok函数 映射共享内存到进程地址空间&#xff1a;shmat 解除共享内存映射&#xff1a;shmdt删除共享内存段&#xff1a;shmctl 利用共享内存进行通信 我们之前学习了匿…

香港服务器怎么看是CN2 GT线路还是CN2 GIA线路?

不知道有没有小伙伴们注意过&#xff0c;很多人在租用香港服务器的时候都习惯性选择 CN2 线路&#xff1f;仿佛香港服务器是否采用 CN2 线路成为个人企业选择香港服务器的一个标准。其实&#xff0c;香港服务器有CN2、优化直连(163)、BGP多线(包含了国际和国内线路)&#xff0c…

Unity 刮刮乐(优化极简)

废话不多说上代码&#xff0c;上图片&#xff0c;欢迎对Unity有兴趣的伙伴和我一起探讨学习 using UnityEngine; using UnityEngine.UI;public class ScratchCardWithSpriteRenderer : MonoBehaviour {// 公开背景和遮罩的Sprite Renderer组件public SpriteRenderer background…