并发编程 interrupt打断park

视频 常见方法-interrupt-打断park

 

park线程是什么?

在Java中,"park线程"通常指的是Java并发包(java.util.concurrent包)中的 LockSupport 类的相关方法,特别是 park() 和 unpark(Thread thread) 方法。
LockSupport 类提供了线程阻塞和解除阻塞的功能,这些功能不依赖于任何对象,而是直接与线程关联。

1.park() 方法:

park() 方法可以使当前线程进入等待状态(阻塞),直到被唤醒或者中断。它可以通过调用 unpark(Thread thread) 方法来解除阻塞。
如果在调用 park() 方法之前已经调用了 unpark(Thread thread) 方法,那么调用 park() 方法将立即返回而不会阻塞。


2.unpark(Thread thread) 方法:

unpark(Thread thread) 方法可以使指定线程恢复运行(解除阻塞)。
如果线程在调用 park() 方法之前已经调用过 unpark(Thread thread) 方法,那么即使 park() 方法还没有被调用,线程也不会进入阻塞状态。

使用场景

线程同步机制: 可以通过 park() 和 unpark(Thread thread) 方法来实现更灵活和精确的线程控制和同步。
任务调度: 在某些并发编程场景下,LockSupport 可以用于更细粒度地控制线程的执行顺序和状态转换。

示例
import java.util.concurrent.locks.LockSupport;

public class ParkThreadExample {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            System.out.println("Thread t1 is starting...");
            // 将当前线程 t1 进行阻塞
            LockSupport.park();
            System.out.println("Thread t1 is unparked.");
        });

        t1.start();

        // 主线程等待一段时间后再解除 t1 的阻塞
        Thread.sleep(2000);

        // 解除线程 t1 的阻塞
        LockSupport.unpark(t1);
    }
}

在这个示例中,线程 t1 在启动后调用 park() 方法被阻塞,主线程等待2秒后调用 unpark(t1) 方法解除 t1 的阻塞状态,使得 t1 线程能够继续执行。
总结来说,"park线程"通常是指通过 LockSupport 类的 park() 和 unpark(Thread thread) 方法实现的一种线程阻塞和解除阻塞机制,用于更精细地控制线程的执行状态。

 

如果在调用 park() 方法之前已经调用了 unpark(Thread thread) 方法,那么调用 park() 方法将立即返回而不会阻塞。这句话什么意思?

这句话的意思是:在调用 LockSupport.park() 方法之前,如果已经对相应的线程调用了 LockSupport.unpark(Thread thread) 方法,那么此时再调用 park() 方法时,线程不会进入阻塞状态,而是会立即返回继续执行后续的代码。
具体来说:

当一个线程调用了 unpark(Thread thread) 方法,如果这个线程之后调用了 park() 方法,那么 park() 方法会立即返回,不会使线程阻塞,而是直接继续执行。
多次调用 unpark(Thread thread) 方法并不会累加作用,每个线程只需要一次 unpark() 来解除由 park() 方法导致的阻塞状态。

这种机制使得 LockSupport 提供了一种更灵活的线程同步和控制方式,可以更精确地控制线程的暂停和恢复,而不像传统的 wait() 和 notify() 那样需要成对使用,且容易导致死锁或无法正常唤醒的情况。

 

posted @ 2024-07-03 09:21  1stzz1  阅读(4)  评论(0编辑  收藏  举报