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. 字符数组转换及数字求和 java8 lambda表达式 demo

    public static void main(String[] args) throws IllegalAccessException { //字符串转换为数字且每个加上100,输出. String ...

  2. Linux安全审计之audit安装与使用

    场景 安全最重要的一步是内部安全,如何监控用户的行为是一个永恒不变的话题. audit可以详细监控用户的行为,详细到查看或修改了某个文件.这些都可以在日志中查看到. 安装 小贴士: CentOS默认已 ...

  3. HBase 中的 JVM 与 GC

    HBase中JVM基本配置 在JVM中,默认情况下会设置minimum heap size 为 1/64 可用物理内存,并为maximum heap size设置 1/4 的物理可用内存(不过在Jav ...

  4. 使用Github Action来辅助项目管理

    Github action 是一个Github官方提供的非常流行且速度集成 持续集成和持续交付(CI/CD)的工具.它允许你在GitHub仓库中自动化.定制和执行你的软件开发工作流.你可以发现.创建和 ...

  5. Java 自定义注解校验字段唯一性

    业务场景 在项目中,某些情景下我们需要验证编码是否重复,账号是否重复,身份证号是否重复等... 那么有没有办法可以解决这类似的重复代码量呢? 我们可以通过自定义注解校验的方式去实现,在实体类上面加上自 ...

  6. Maven pom.xml文件

    pom.xml 版本依赖 <!--编译器依赖--> <properties> <project.build.sourceEncoding>UTF-8</pro ...

  7. SpringBoot2.X新版本配置拦截器在项目中的使用

    拦截器:和过滤器用途基本类似 SpringBoot2.X新版本配置拦截器 implements WebMvcConfigure 自定义拦截器 HandlerInterceptor preHandle: ...

  8. 1. C++ 开发环境

    C++ 开发环境 Visual C++ / GCC(G++) / Clang(Clang++) 集成开发环境:Visual Studio / CodeLite / Code::blocks / CLi ...

  9. 解决方案 | PPT右键复制文本时右键粘贴选项按钮为空白

    1.问题 2.解决方法 随便复制一些文字,不要采用CRTL+V,而是采用右键粘贴方法到ppt中,选择纯文本的"A"符号. 之后再使用CTRL+C复制,CTRL+V即正常.(好像只能 ...

  10. CentOS 8安装docker

    1.查看Linux内核(Docker最低支持CentOS 7 64位 内核3.10) uname -a 2.安装docker(输入yes,然后等待-) yum install docker 3.启动d ...