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. 社会工程学——进行IP追踪

    如果目标对象有一个公开的邮箱,可以往这个邮箱地址发试探性的Email,然后看看该邮件是否有[回信],从而了解对象是否在线.(注:这招是社会工程学的基本伎俩) 说一个稍微高级点的邮件技巧--[不依赖回信 ...

  2. kettle从入门到精通 第七十一课 ETL之kettle 再谈http post,轻松掌握body中传递json参数

    场景: kettle中http post步骤如何发送http请求且传递body参数? 解决方案: http post步骤中直接设置Request entity field字段即可. 1.手边没有现成的 ...

  3. CLR via C# 笔记 -- 数组(16)

    1. 数组隐式继承 System.Array,所以数组是引用类型.变量包含的是对数组的引用,而不是包含数据本身的元素. 2. 数组协变性.将数组从一种类型转换为另一种类型. string[] sa = ...

  4. .NET 认识日志系统-2

    .NET 日志系统2 上一篇文章是将日志打印到控制台,这篇文章将日志写入到文本文件中. 文本日志一般按照日期区分 如何避免文本日志把磁盘撑爆? 限制日志总个数或者总大小 如何避免一个日志文件太大? 限 ...

  5. 多核处理器与MP架构

    多核处理器也称片上多核处理器(Chip Multi-Processor,CMP). 多核处理器的流行 多核出现前,商业化处理器都致力于单核处理器的发展,其性能已经发挥到极致,仅仅提高单核芯片的速度会产 ...

  6. 执行insmod提示 invalid module format

    内核版本和驱动版本不匹配: 1.假如内核版本是2018.3,驱动使用了另外一个版本,可能会出现这样的问题 2.内核和驱动版本一致,但内核进行了一些配置,导致驱动装不上,此时应该: make clean ...

  7. 攻防世界——CRYPTO新手练习区解题总结<3>(9-12题)

    第九题easychallenge: 下载附件,得到一个后缀为pyc的文件,上网百度一下pyc文件,得知 pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变 ...

  8. 是什么导致了客户端TCP连不上服务器?

      这几年做了很多基于 GGTalk开源即时通讯系统 的定制开发项目,经常会碰到如下两个问题,分享出来,应该对大家会有所帮助: (1)定制开发完成后,在给客户部署GGTalk即时通讯服务端到正式的服务 ...

  9. 全国产RK3568J + FPGA的PCIe、FSPI通信实测数据分享!

    测试数据汇总 案例 时钟频率 理论速率 测试结果 FSPI通信案例 150MHz 71.53MB/s 读速率:67.452MB/s 写速率:52.638MB/s PCIe通信案例 100MHz 803 ...

  10. Vue 数组和对象更新,但视图未更新,背后的故事

    在实际开发中,遇到遍历数组和对象,当property 发生改变时,并没有触发视图的更新今天来浅显的聊聊这背后的故事,有说的不对地方,还望指出! 本人博文地址:https://www.cnblogs.c ...