线程基础---基础方法

2023-11-03

线程启动

在Thread类中注释标明有两种方式创建新的执行线程:

  1. 一种是声明一个类是Thread的子类。这个子类应该重写类Thread的run方法。然后可以分配和启动子类的实例
  2. 创建线程的另一种方法是声明一个实现Runnable接口的类。这个类然后实现run方法。然后可以分配类的实例,在创建Thread时作为参数传递,并启动

两种方式对比:

  1. 从java语法方面来看,java没有多继承,如果使用继承Thread的方式,就不能再继承其他类,限制了代码的可扩展性
  2. 从效率方面来看,如果通过实现Runnable接口的方式,可以作为一个任务当做参数传入到线程中,这时的线程可以使用线程池。而通过继承的方式,每次创建和销毁线程相对来讲会消耗资源,效率并不高

中止线程

错误方式

stop():已弃用,停止方式会使业务逻辑不完整

正确方式

interrupt()

将中断位标记设置位true

isInterrupted()

返回该线程的中断标记位

interrupted()

返回重置当前线程的中断标记位

interrupt():推荐使用,简单来讲就是向线程发送一个中止信号,但该线程是否中止,什么时候中止,取决于目标线程的应答

isInterrupted():返回该线程的中断标记位,可以搭配interrupt()组合使用

使用interrupt()中止一个正在运行的线程

public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            while (true) {
                // 搭配isInterrupted()正常中止线程
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("thread 正常中止");
                    break;
                }
            }
        });
        thread.start();
        Thread.sleep(1000);
        thread.interrupt();
    }

中断正在休眠的线程

private static final Object lock = new Object();
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            synchronized (lock) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("flag");
            }
        });
        thread.start();
        // 此时中断TIME_WATING状态的线程,会抛出InterruptedException
        // wait(), wait(long),wait(long, int)  join(), join(long), join(long, int), sleep(long),  sleep(long, int), cleared and it will receive an InterruptedException.
        // interrupt方法注释明确标注:如果在使用上述方法期间被打断,会重置标记位并抛出一个异常
        thread.interrupt();
    }
**********运行结果****************
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at com.nuc.demo.thread.CarThread.lambda$main$0(CarThread.java:33)
	at java.lang.Thread.run(Thread.java:748)
false

备注:凡是会抛出InterruptedException信息的方法,一般都会在其抛出异常之前将当前线程的中断标志位重置为false

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程基础---基础方法 的相关文章

随机推荐

  • 项目经理和技术经理的区别

    一 关于项目经理 在没有真正进入软件行业之前 对于系统集成方面的项目还是有些心得的 有种一个人事无巨细的带一票人打江山的感觉 项目合同要负责 项目具体需求要负责 项目人员分配要负责 项目实施要指挥 管理心态 是关键 不懂技术 可以 不懂全局
  • 将字符串中的‘*’移动到字符串最前面且不改变原来非‘*’字符的顺序

    过程如下图所示
  • 带你理解运算放大器

    复习一下电子设计基本元器件 运算放大器 矜辰所致 目录 前言 一 运放基本说明 1 1 基本认识 1 2 运放中的电流 1 3 运放工作特性 二 负反馈 2 1 什么是负反馈 2 2 为什么要引入负反馈 负反馈电路分析 2 3 正反馈 三
  • Padavan(老毛子)脚本自动切换网关和 DNS 服务器

    家中网络连接示意图 已省略接在主路由上的光猫 基本情况 联通宽带 光猫改桥接 主路由拨号 主路由红米AC2100 RM2100 老毛子系统 padavan 3 4 3 9 099 20200619 IP 10 0 0 1 NAS 蜗牛星际A
  • SVN文件夹图标不正常显示解决方案(win10)android studio

    在使用Android Studio提交代码时发现svn图标莫名其妙的不显示 其他操作都正常 在网上搜了一堆资料都有各种说法 结合了操作 一步步来试终于给我找到了 在这我自己总结一下 一部分也是拷贝别的图片 写一篇清楚文章好希望能帮助和我遇到
  • frp实现内网穿透(内网服务器到公网访问的方案)

    目录 背景 一 frp的简介 二 Frp Server的配置 三 Frp Client的配置 背景 我使用python写了一个http后端 如代码所示 ip为10 1 136 73 port为8000 现在需要把http后端在公网可以被使用
  • echarts 中x轴 设置步长,间隔的距离

    如果你已经使用了 echarts xAxis axisLabel interval 5 在 xAxis 下面 axisLabel 里面的 interval 值即可 interval 为 0 时 所有的标签都显示出来 interval 表示步
  • 详解ThreadLocal

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 1 ThreadLocal介绍 1 1 官方介绍 1 2 基本用法 1 2 1 常用方法 1 2 2 使用案例 1 3 ThreadLocal与synchroniz
  • [Python人工智能] 四.TensorFlow创建回归神经网络及Optimizer优化器

    从本篇文章开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前一篇文章讲解了TensorFlow基础和一元直线预测的案例 以及Session 变量 传入值和激励函数 这篇文章将详细介绍TensorFlow创建回归神经网
  • 少儿编程有必要吗?

    这几年 人工智能正以难以想象的速度向前开展 AlphaGo赢了柯洁 百度无人巴士量产 京东开端启用机器人送快递 谷歌的AI都学会了自行freestyle 科技的推翻式立异 随之引发教育风向大变革 除了语数外 老三样 的根底教育外 一门新兴学
  • STM32驱动HC05蓝牙串口通信模块

    前言 时不可以苟遇 道不可以虚行 今天分享一下最近学习的 HC05 蓝牙模块 通过用 手机蓝牙控制 STM32 单片机 进行 点灯 传输数据 显示波形 等基础操作 一 介绍 HC05模块是一款高性能主从一体蓝牙串口模块 说白了 只是个蓝牙转
  • oracle排序后从相同的顺序中随机取一行

    要求 要求从这个表取数据 v2字段相同的 随机取一个出来 第1 2随机取一行 第5 6 7行随机取一行 其他的3 4行都保留 效果展示 查询语句写法 Select s from select t row number over partit
  • 【数据分析】数据分析方法(六):相关分析 & 群组分析

    数据分析方法 六 相关分析 群组分析 1 相关分析方法 当我们研究两种或者两种以上数据之间有什么关系的时候 就要用到相关分析 在解决问题的过程中 相关分析可以帮助我们扩大思路 将视野从一种数据扩大到多种数据 通过计算相关系数 我们可以看到两
  • 栈的应用——深度优先搜索(走迷宫)

    栈应用到走迷宫 寻路算法 的做法 迷宫就是下图所示的这种 这次主要是先用代码画出一个迷宫 利用二维数组 然后寻路走到出口 代码如下 在C 中运行 mystack h include
  • 统计文件数目

    编写一个程序 统计某个目录下 含子目录 里的所有目录数和文件数 import os path 在引号里加入需要统计的文件夹目录 def list files path file num 0 files num 0 for root dirs
  • 快手只发作品不直播的赚钱方法

    快手只发作品不直播的赚钱方法 玩快手也不开直播 只发段子 有这三种变现方式 我只告诉你可以往下看吗 以下几种方式 你千万记住点开左上角的三条杠 点击更多点击创作者中心 这个时候我们到里面找到什么任务中心点进来 这个时候到你该转米的时候了 随
  • spring 增强顺序改变的原因

    spring 增强顺序改变的原因 spring 5 2 7版本正式改变增强的顺序 网上的大部分文章主要从spring的代码层面的变动 来解释增强顺序的变动 而我想要了解的是这个变动 是因为导致了某些bug的出现吗 所以自己在github和s
  • Java中数据类型分类?

    转自 Java中数据类型分类 下文笔者讲述java中数据类型的分类 如下所示 基本数据类型boolean 布尔类型 short 短整型 int 整型 long 长整型 byte 字节型 char 字符型 float 单精度浮点型 doubl
  • 数据对象属性分类

    数据集由数据对象组成 一个数据对象代表一个实体 数据对象又称样本 实例 数据点或对象 属性 attribute 是一个数据字段 表示数据对象的一个特征 属性向量 或特征向量 是用来描述一个给定对象的一组属性 属性有不同类型 标称属性 nom
  • 线程基础---基础方法

    线程启动 在Thread类中注释标明有两种方式创建新的执行线程 一种是声明一个类是Thread的子类 这个子类应该重写类Thread的run方法 然后可以分配和启动子类的实例 创建线程的另一种方法是声明一个实现Runnable接口的类 这个