多线程-Thread类的常用方法及使用场景

2023-11-07

众所周知,操作线程就必须熟读线程的API方法,万一你开个多线程刹不住车就歇菜了,下面就介绍一些API基本用法。包括sleep,join,yield,interrupt。

sleep,让当前线程睡一会。原生用法Thread.sleep(毫秒),会抛出一个打断的异常;此方法可防止CPU100%的问题,如果你代码中有轮训机制,就会体验到。while(true) 中加上一个sleep,CPU至少会减低80%消耗。一般我们采用自制工具类。因为JUC中支持改玩意,不需要每次去catch异常

public class SleepUtils {
    public static void sleep(int second){
        try {
            TimeUnit.SECONDS.sleep(second);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

join是等待调用join线程结束继续运行,一般用于线程间通信。比如t1烧水,t2泡茶两个线程。显然t2需要等t1结束后才能开始,那么就可以使用t1.join()来实现。

join代码展示

@Slf4j
public class Thread03 {
    public static int i =0;
    public static void main(String[] args) throws Exception{
       Thread t1 =  new Thread(()->{
            log.info("t1 start");
            SleepUtils.sleep(1);
            i++;
        });
        t1.start();
        t1.join();//必须等t1执行完,否则可能i=0
        log.info("t1 start i={}",i);
    }
}

yield是指短暂放弃CPU使用权,让其他线程优先执行。这个在处理冷热数据的时候可用上。如t1,t2两个线程都是处理售票,t2可能封面搞了个美女访问量更多,但其实t1,t2两个是同时抢占CPU时间片在运行的,在java层面就可以t1线程使用Thread.yield() 让t2单位时间处理能力更强。

interrupt是打断线程。这里分两种情况,当打断打断运行线程时不会中断服务,会继续执行打断后逻辑,打断后标记为true。当打断阻塞线程 sleep wait join 会中断服务,打断后打断标记仍为false。

interrupt代码展示,这个例子就是线程二阶段打断,判断了运行时打断和阻塞时打断。以及打断标识的处理。

@Slf4j
public class ThreadInterrupt02 {
    public static void main(String[] args) {
        /**
         * 有一个监控线程,如果出现异常则停止,如果未出现继续监控
         */
        Monitor monitor = new Monitor();
        monitor.start();
        SleepUtils.sleep(5);//休眠5s后执行打断操作
        monitor.stop();
    }
}

@Slf4j
    class Monitor {
        private Thread monitor;

        public void start(){
            monitor = new Thread(()->{
                while (true){
                    log.info("monitor 正在监控中");
                    //判断当前线程上次是否被打断,如果打断直接退出
                   if (Thread.currentThread().isInterrupted()) {
                       log.info("monitor 被打断");
                       break;
                   }
                   //如果没退出,休眠2秒继续执行,此过程可能会打断
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        log.info("睡眠被打断");
                        e.printStackTrace();
                        Thread.currentThread().interrupt();//如果在睡眠过程被打断,标识仍为false,不会break,所以这里二次打断
                    }
                }
            });
            monitor.start();
        }
        public void stop(){
            monitor.interrupt();
            log.info("线程执行打断");
        }
    }

 

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

多线程-Thread类的常用方法及使用场景 的相关文章

随机推荐

  • Appium自动化框架从0到1之 基类的封装

    这里只封装了4个基类 其他的大家可以自己丰富 直接上代码 baseView py coding utf 8 auth carl DJ time 2020 7 9 class BaseView object 封装一些基类 def init s
  • wazuh安装,单机部署3.13

    Wazuh涉及两个主要组件的安装 Wazuh服务器和Elastic Stack 此外 Wazuh agent需要部署到受监视的主机上 Wazuh server 运行Wazuh管理器和API 它从已部署的代理收集和分析数据 Elastic S
  • Java多线程基础

    原文链接 https blog csdn net weixin 43704599 article details 107379994 1 线程简介 1 1 多任务 现实中太多这样同时做多件事情的例子了 看起来是多个任务都在做 其实本质上我们
  • 一个SQLiteReadOnlyDatabaseException的问题

    最近测试同事上报了随机的一个crash问题 看日志是SQLiteReadOnlyDatabaseException的问题 发生在update数据库的时候 我自己写的ContentProvider代码就是在程序目录下放置数据 所以不是网上常见
  • ROS1与ROS2的安装教程

    目录 一 准备工作 1 ros1对应ubuntu版本 2 ros2对应ubuntu版本 3 Ubuntu的安装 二 ROS1的安装 1 官方安装ROS的说明 http wiki ros org Installation Ubuntu dis
  • 基于MySQL的关系型数据库完成情况_SQLite vs MySQL vs PostgreSQL:关系型数据库比较...

    自1970年埃德加 科德提出关系模型之后 关系型数据库便开始出现 经过了40多年的演化 如今的关系型数据库种类繁多 功能强大 使用广泛 面对如此之多的关系型数据库 我们应该如何权衡找出适合自己应用场景的数据库系统呢 O S Tezer最近在
  • 3D数据转换一站式解决方案CAD Exchanger软件介绍

    3D数据转换一站式解决方案CAD Exchanger软件介绍 CAD Exchanger GUI是易于使用的3D查看器和转换器 用于读取和转换所有关键3D格式 IGES STEP JT ACIS Parasolid IFC FBX Soli
  • 网络安全的防护措施 45.113.202.1

    病毒和木马 安装杀毒软件定期扫毒 不接收陌生文件 下载软件尽量在正规网站下载 来路不明的U盘不要使用 DDOS攻击 设置硬件防火墙 监控 限制和预防 入侵 加强口令识别 定期更新软件 避免漏洞被利用 45 113 202 1 45 113
  • 动态爱心(html版)

  • iPhone清理喇叭灰尘_微信可以给手机喇叭超声波清理灰尘了 苹果安卓机都适用 超简单!...

    之前针对果粉用户分享过一个 喇叭灰尘清理 快捷指令 受到不少小伙伴的欢迎 这个快捷指令主要是利用声波震动原理实现 在一定程度上起到清理手机喇叭灰尘的作用 现在有开发者 将这个喇叭清理清理音频放在了小程序上 在微信上就可以给手机扬声器清理灰尘
  • 判断一个数的二进制表示中是否有连续的1

    判断一个数的二进制表示中是否有连续的1 例如 101 里就没有 而 110 里就有 def my function n return n n lt lt 1 gt 0 if name main print my function 5 参数n
  • springboot如何集成mybatis中的分页插件pagehelper

    为什么要引入pagehelper 这里代码简写 原始写法计算起始页 page 1 pageSize pageSize 结束页 pageSize select 字段名称 from 表名 limit 起始页 结束页 有个这个以后就不用这么写了直
  • Flutter使用SQLite

    1 添加依赖 在pubspec yaml添加sqflite插件 dependencies flutter sdk flutter sqflite 1 3 1 然后在项目根目录下执行如下命令 flutter pub get 2 使用SQLit
  • 剑指 Offer 63. 股票的最大利润

    剑指 Offer 63 股票的最大利润 题目 题目链接 解题思路 题解 代码 题目 题目链接 https leetcode cn com problems gu piao de zui da li run lcof 解题思路 题解 动态规划
  • 微软五笔调用

    微软五笔调用 点击已安装语言包 选项 添加键盘 微软五笔
  • Python中logging:设置打印级别,打印格式,打印颜色

    目录 前言 一 引入库 二 实现代码 三 运行结果 四 补充知识 logging模块的日志级别 前言 控制log的打印级别 打印格式 控制台根据log级别打印不同的颜色 一 引入库 import logging import colorlo
  • 一步一步学android控件(之六) —— MultiAutoCompleteTextView

    今天学习的控件是MultiAutoCompleteTextView 提到MultiAutoCompleteTextView 我们就自然而然地想到AutoCompleteTextView 就想知道他们之间到底有什么区别 在讲他们区别之前呢先来
  • 产品经理面经

    相信很多产品经理在跳槽面试的时候 在面试尾声都会遇到这样的环节 面试官会问你有什么问题要问的 一般来说大家都能随时随地甩出几个问题来化解 但其实在这个环节对于应聘者来说也是一个很好的机会来展现自己的能力 甚至还能借此环节来挽回前面表现不佳的
  • 年轻人存款之难与突破

    导语 近日 有关年轻人存款的调查数据引发了广泛讨论 称大约五分之一的年轻人存款在一万元以内 存款超过10万元似乎成为一个 坎 只有不到半数的人能够跨越这一难关 在这个话题引发热议的背景下 让我们来探讨年轻人存款难的原因以及如何突破这个困境
  • 多线程-Thread类的常用方法及使用场景

    众所周知 操作线程就必须熟读线程的API方法 万一你开个多线程刹不住车就歇菜了 下面就介绍一些API基本用法 包括sleep join yield interrupt sleep 让当前线程睡一会 原生用法Thread sleep 毫秒 会