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. Apollo config配置中心 配置列表和map DEMO

    Apollo config配置中心 配置列表和map DEMO#支持可扩展 Apollo配置 apollo中配置如下: defaultId = 100,200 chooseId = {"30 ...

  2. 简约-Markdown教程

    ##注意 * 两个元素之间最好有空行 * 利用\来转义 我是一级标题 ==== 我是二级标题 ---- #我是一级标题 ##我是二级标题 ##<center>标题居中显示</cent ...

  3. 【FAQ】HarmonyOS SDK 闭源开放能力 —Ads Kit

    1.问题描述: 开屏广告效果最好的实现方式? 解决方法: 1.动画效果和开发者的实现方式有关,和开屏广告页面本身没什么关系的: 2.示例代码中使用Router跳转的方式展示广告,主要是用于演示广告接口 ...

  4. Linux 错误码

    背景 Linux的错误码包含在/usr/include/asm-generic/errno-base.h和/usr/include/asm-generic/errno.h 这两个文件内. 可用于查询. ...

  5. 你要的AI Agent工具都在这里

    只有让LLM(大模型)学会使用工具,才能做出一系列实用的AI Agent,才能发挥出LLM真正的实力.本篇,我们让AI Agent使用更多的工具,比如:外部搜索.分析CSV.文生图.执行代码等. 1. ...

  6. nginx 如何利用gzip压缩配置来优化网站访问速度

    前言: 最近公司设计的网站前端是基于nuxt架构的,部署到nginx上后,首页的访问以及二级页面的访问极慢,f12观察后发现主要是一些js页面加载极慢拉低了网站的访问速度,于是便想到利用nginx里的 ...

  7. vba--分拆工作薄

    Sub 分拆工作薄() '分拆工作薄到当前文件夹 Dim sht As Worksheet Dim MyBook As Workbook Application.DisplayAlerts = Fal ...

  8. Qt中全局变量的定义和使用

    全局变量的定义 现在需要将自定义的STRParameter变量定义为全局变量,就需要新建两个文件,分别命名为"global.h"和"global.cpp" 在g ...

  9. Spring定时任务和@Async注解异步调用

    Spring定时任务 1.@Scheduled注解方式 使用方式 @Scheduled的使用方式十分简单,首先在项目启动类添加注解@EnableScheduled. 编写定时任务方法,方法上添加注解@ ...

  10. node.js (原生模板引擎模板)

    app01 // 引入http模块 const http = require('http'); //连接数据库 require('./model/connects'); // 创建网站服务器 cons ...