多线程之park()与interrupt()的理解
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()的理解的更多相关文章
- iOS多线程之GCD小记
iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...
- 多线程之join方法
join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方 ...
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
- Java线程之 InterruptedException 异常
Java线程之 InterruptedException 异常 当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...
- JAVA多线程之volatile 与 synchronized 的比较
一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...
- java多线程之yield,join,wait,sleep的区别
Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...
- Java基础-进程与线程之Thread类详解
Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...
- Java多线程之Runnable与Thread
Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...
- iOS多线程之8.NSOPeration的其他用法
本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...
- python 线程之 threading(四)
python 线程之 threading(三) http://www.cnblogs.com/someoneHan/p/6213100.html中对Event做了简单的介绍. 但是如果线程打算一遍一遍 ...
随机推荐
- HttpServletRequest获取header参数 sign
HttpServletRequest获取header参数 sign //从请求头中获取参数 private static Map<String, String> getHeaders(Ht ...
- elasticsearch-head插件安装及启动,关闭命令
启动插件 /elasticsearch-head目录npm run start启动elasticsearch 不能使用root账号 切换账号:su es./bin/elasticsearch 打印日志 ...
- mysql+redis点赞功能剖析
最近在一个应用上需要用到点赞的功能,因为点赞的功能比较常用,很多人看到了大拇指就点了上去,如果单单采用mysql的方式的话可以会对数据库造成很大的压力. 我看了下网上一些博主的提供的解决方案,主要以m ...
- Linux OpenGrok搭建
目录 一.目的 二.环境 三.相关概念 3.1 OpenGrok 3.2 CTags 3.3 Tomcat 四.OpenGrok搭建 4.1 安装jdk 4.2 安装ctags依赖 4.3 安装uni ...
- Android系统启动:.rc文件
Android系统启动:.rc文件 reference : https://www.jianshu.com/p/a4c17f0110d0 以init.rc为例. .rc文件 init.rc文件由系统第 ...
- docker部署微服务之注册中心
1.首先要对对应服务的pom.xml文件进行修改,添加如下配置. 2.在微服务的pom.xml目录下建立Dockerfile文件 3.在Dockerfile当前目录下执行mvn clean insta ...
- C# pythonnet(3)_Butter-worth低通滤波
Python代码如下 import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy import ...
- 【Python】基于动态规划和K聚类的彩色图片压缩算法
引言 当想要压缩一张彩色图像时,彩色图像通常由数百万个颜色值组成,每个颜色值都由红.绿.蓝三个分量组成.因此,如果我们直接对图像的每个像素进行编码,会导致非常大的数据量.为了减少数据量,我们可以尝试减 ...
- The Beauty of Physics
绪言/1 学物理的人用不着对物理方程的意义操心,只要关心物理方程的美就够了. --狄拉克 此曲只应天上有--开普勒的和谐宇宙/11 天体的运动只不过是某种永恒的复调音乐而已,要用才智而不是耳朵来倾听. ...
- 洛谷P1378
这道题需要处理的信息比较多,需要注意的是一个油滴扩展后可能会包含其他的点 #include <iostream> #include <utility> #include < ...