1.背景

其他不多说,很多时候面试会问

2.代码

package com.ldp.demo01;

import com.common.MyThreadUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test; import java.util.concurrent.locks.LockSupport; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 01/29 11:11
* @description <p>
* park()理解
* 1.他不是Thread中的方法,而是LockSupport.park();
* 2.LockSupport.park();执行了该方法后,后面的代码将暂停;
* 3.LockSupport.park(); 只有在isInterrupted状态为false的情况下才有效,interrupt()方法可以让暂停的方法继续执行;
* 4.Thread.interrupted() 这个方法会返回当前interrupt状态,如果interrupt=true会将其改变为 interrupt=false,反之则不成立
* </p>
*/
@Slf4j
public class Test04Park {
/**
* LockSupport.park();执行了该方法后,后面的代码将暂停;
*/
@Test
public void test01() {
Thread t1 = new Thread(() -> {
log.debug("执行中1...");
LockSupport.park();
log.debug("执行中2...");
}, "t1");
t1.start();
// 暂停5秒避免线程结束
MyThreadUtil.sleep(5);
} /**
* LockSupport.park(); 只有在isInterrupted状态为false的情况下才有效,interrupt()方法可以让暂停的方法继续执行;
*/
@Test
public void test02() {
Thread t1 = new Thread(() -> {
log.debug("执行中1...");
LockSupport.park();
log.debug("interrupt=" + Thread.currentThread().isInterrupted());
log.debug("执行中2...");
}, "t1");
t1.start();
// 1秒后让暂停的方法继续执行
MyThreadUtil.sleep(1);
t1.interrupt();
// 暂停5秒避免线程结束
MyThreadUtil.sleep(5);
} /**
* LockSupport.park(); 只有在isInterrupted状态为false的情况下才有效,interrupt()方法可以让暂停的方法继续执行;
* 如果isInterrupted状态为false,再次park无效
*/
@Test
public void test03() {
Thread t1 = new Thread(() -> {
log.debug("执行中1...");
LockSupport.park();
log.debug("interrupt=" + Thread.currentThread().isInterrupted());
log.debug("执行中2...");
// 再次park,无效
LockSupport.park();
log.debug("执行中3...");
// 设置 isInterrupted状态为false,再次park有效效
Thread.interrupted();
log.debug("interrupt=" + Thread.currentThread().isInterrupted());
// 再次park,有效
LockSupport.park();
log.debug("执行中4...");
}, "t1");
t1.start();
// 1秒后让暂停的方法继续执行
MyThreadUtil.sleep(1);
t1.interrupt();
// 暂停5秒避免线程结束
MyThreadUtil.sleep(5);
} /**
* 扩展:Thread.interrupted(); 与 t1.interrupt() 区别
* Thread.interrupted() 这个方法会返回当前interrupt状态,如果interrupt=true会将其改变为 interrupt=false,反之则不成立
*/
@Test
public void test04() {
Thread t1 = new Thread(() -> {
log.debug("执行中1...");
Thread currentThread = Thread.currentThread();
log.debug("interrupt原始=>" + currentThread.isInterrupted()); // 设置打断标记
currentThread.interrupt();
log.debug("interrupt1=>" + currentThread.isInterrupted()); // 再次设置打断标记
currentThread.interrupt();
log.debug("interrupt2=>" + currentThread.isInterrupted()); // 使用Thread.interrupted() 方法
boolean interrupted01 = Thread.interrupted();
log.debug("interrupted01=>" + interrupted01);
log.debug("interrupt3=>" + currentThread.isInterrupted()); // 再次使用Thread.interrupted() 方法
boolean interrupted02 = Thread.interrupted();
log.debug("interrupted02=>" + interrupted02);
log.debug("interrupt4=>" + currentThread.isInterrupted()); // 再再次设置打断标记
currentThread.interrupt();
log.debug("interrupt5=>" + currentThread.isInterrupted()); log.debug("interrupted.....1=>" + Thread.interrupted());
log.debug("interrupted.....2=>" + Thread.interrupted());
log.debug("interrupted.....3=>" + Thread.interrupted()); log.debug("interrupt6=>" + currentThread.isInterrupted()); log.debug("执行结束..."); }, "t1");
t1.start();
// 暂停5秒避免线程结束
MyThreadUtil.sleep(10);
}
}

完美

多线程之park()与interrupt()的理解的更多相关文章

  1. iOS多线程之GCD小记

    iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...

  2. 多线程之join方法

    join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方 ...

  3. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  4. Java线程之 InterruptedException 异常

    Java线程之 InterruptedException 异常   当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...

  5. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  6. java多线程之yield,join,wait,sleep的区别

    Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...

  7. Java基础-进程与线程之Thread类详解

    Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...

  8. Java多线程之Runnable与Thread

    Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...

  9. iOS多线程之8.NSOPeration的其他用法

      本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...

  10. python 线程之 threading(四)

    python 线程之 threading(三) http://www.cnblogs.com/someoneHan/p/6213100.html中对Event做了简单的介绍. 但是如果线程打算一遍一遍 ...

随机推荐

  1. jquery中$.get()提交和$.post()提交有区别吗?

    相同点: 都是异步请求的方式来获取服务端的数据: 异同点: a.请求方式不同:$.get() 方法使用GET方法来进行异步请求的.$.post() 方法使用POST方法来进行异步请求的. b.参数传递 ...

  2. Lakehouse 还是 Warehouse?(2/2).md

    这篇博文包括 Onehouse 首席执行官 Vinoth Chandar 于 2022 年 3 月在奥斯汀数据委员会发表的重要演讲的后半部分.本文是第 2 部分,比较了架构的功能和性价比特征.最后,它 ...

  3. 基于SDF的光照效果

    基于SDF的光照效果 好久没写博客了,怠惰了,就当爬了一步 原神二次元风格面部渲染 效果 Show me the code Shader "Unlit/SDF" { Propert ...

  4. 有点儿神奇,原来vue3的setup语法糖中组件无需注册因为这个

    前言 众所周知,在vue2的时候使用一个vue组件要么全局注册,要么局部注册.但是在setup语法糖中直接将组件import导入无需注册就可以使用,你知道这是为什么呢?注:本文中使用的vue版本为3. ...

  5. 在Xcode编写我们的quick help

    程序环境 Xcode 13.2.1 "写代码要经常写注释."虽然很多人不以为然,但是在使用Xcode的时候,我们在写注释的时候稍微注意一下格式的话,Xcode会给我们带来额外的正反 ...

  6. Java面试知识点(四)重写和重载

    重写override 在 java 中有很多的继承,继承下来的有变量.方法.在有一些子类要实现的方法中,方法名.传的参数.返回值跟父类中的方法一样,但具体实现又跟父类的不一样,这时候我们就需要重写父类 ...

  7. 【WPF】根据选项值显示不同的编辑控件(使用DataTemplateSelector)

    接了一个小杂毛项目,大概情形是这样的:ZWT先生开的店是卖拆片机的,Z先生不仅卖机器,还贴心地提供一项服务:可以根据顾客需要修改两个电机的转向和转速(机器厂家有给SDK的,但Z自己不会写程序).厂家有 ...

  8. HGAME2023 week1-week2

    确实是高质量比赛,学到了很多知识.认识到了很多的不足. 任重而道远啊... hgame_week1 web Classic Childhood Game F12检查源码,打开Events.js 发现 ...

  9. msgpack的使用

    1.引入包 <!--msgpack依赖--> <dependency> <groupId>org.msgpack</groupId> <artif ...

  10. 算法金 | DL 骚操作扫盲,神经网络设计与选择、参数初始化与优化、学习率调整与正则化、Loss Function、Bad Gradient

    大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 今日 216/10000 抱个拳,送个礼 神经网络设计与选择 参数初始化与优化 学习率 ...