多线程之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 

* park()理解 * 1.他不是Thread中的方法,而是LockSupport.park(); * 2.LockSupport.park();执行了该方法后,后面的代码将暂停; * 3.LockSupport.park(); 只有在isInterrupted状态为false的情况下才有效,interrupt()方法可以让暂停的方法继续执行; * 4.Thread.interrupted() 这个方法会返回当前interrupt状态,如果interrupt=true会将其改变为 interrupt=false,反之则不成立 *

*/ @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); } }

完美