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

完美

posted @ 2022-01-29 12:04  李东平|一线码农  阅读(345)  评论(0编辑  收藏  举报