当前位置: 首页 > news >正文

Thread中几个常用的api详解join,interrupt

1.join()

join方法可以在多线程中帮我们实现调用线程的同步效果,比如,现在有三个线程,a,b,c

a中启动了b和c线程异步去执行一件事,但是a希望他们做完以后再继续往下执行,那么就可以在调用b和c启动之后,调用每个线程的join方法,意思是等待它们执行完毕,代码如下:

    public static void main(String[] args) throws InterruptedException {Thread thread = new Thread() {@Overridepublic void run() {System.out.println("我是线程1");}};Thread thread1 = new Thread() {@Overridepublic void run() {System.out.println("我是线程2");}};thread.join();thread1.join();System.out.println("我是主线程");}

2.interrupt()

这个方法可以理解成打断线程的当前状态,有以下几个场景啊:我们通常可以用来实现通过一个线程,控制另一个线程是否运行,在需要通知另一个线程的时候调用interrupt(),然后在停止的线程中有一个判断逻辑,判断当前线程的状态

  • 打断阻塞状态下的线程,比如调用了sleep或者是yield方法等,如果这个时候,别的线程调用了该线程的interrupt()方法,就会抛出一个interruptedException,并且把是否打断状态改为false
  • 打断正在运行的线程,意思就是正在执行别的代码,没有处于sleep或别的状态下,那么这个时候就会把,thread1.isInterrupted(),值改为true
  • 打断park,park就是让当前线程阻塞,调用该线程的interrupt(),可以让它继续向下运行,但是注意哦,park方法是否继续向下运行,依靠的是当前线程thread1.isInterrupted()是否为true,如果为true,则无法再次阻塞,意思就是假如一个线程调用了一次LockSupport.park()方法,此时另一个线程打断了它,那么它继续往下运行的时候,又调用了一次LockSupport.park()方法,是没办法阻塞的,因为这个时候当前线程的isInterrupted()为true,所以如果希望再次往下运行,可以在第一次park()方法的后边,调用Thread.Interrupted()方法,可以帮我们把打断状态改为false,使程序调用park()方法时可以再次阻塞,代码大致如下
        public static void main(String[] args) throws InterruptedException {Thread thread = new Thread() {@Overridepublic void run() {LockSupport.park();System.out.printf("当前打断状态为%s\n",Thread.interrupted());LockSupport.park();System.out.println("dssdsds");}};thread.start();thread.interrupt();}

http://www.lryc.cn/news/159045.html

相关文章:

  • Golang项目实战(三)
  • TSUMU58CDT9-1显示器芯片方案
  • React 安装使用 Less(详细流程,包含 webpack、craco 方式)
  • 力扣(LeetCode)算法_C++—— 快乐数
  • 滴滴笔试——算式转移
  • [LeetCode] 128. 最长连续序列
  • docker 安装rabbitmq
  • 一文概览NLP句法分析:从理论到PyTorch实战解读
  • NPM 常用命令(三)
  • UWB学习——day1
  • 2023国赛数学建模C题模型代码
  • 2023年高教社杯数学建模国赛C题详细版思路
  • 互联网摸鱼日报(2023-09-07)
  • 并行处理系统
  • 2023国赛数学建模A题思路分析 - 定日镜场的优化设计
  • git企业级使用
  • [docker]笔记-存储管理
  • 记录获取蓝鲸智云token的过程
  • C语言AES加密解密字符串与16进制数据
  • NIFI实现JSON转SQL并插入到数据库表中
  • 【canal系】canal集群异常Could not find first log file name in binary log index file
  • ESP32C3 PWM输出
  • 二、GoLang输出HelloWorld、基本数据类型、变量常量定义、基本类型转换
  • mojo初体验
  • python3 重启docker方法
  • 【js】js中深拷贝与浅拷贝:
  • 大文件上传demo,前端基于Uppy,后端基于koa
  • typeScript--[函数定义]
  • Spring初始化项目
  • Opencv 图像金字塔----高斯和拉普拉斯