首页 > 编程语言 >并发编程 interrupt打断park

并发编程 interrupt打断park

时间:2024-07-03 09:33:37浏览次数:13  
标签:调用 Thread 编程 park unpark 线程 interrupt 方法

视频 常见方法-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() 那样需要成对使用,且容易导致死锁或无法正常唤醒的情况。

 

标签:调用,Thread,编程,park,unpark,线程,interrupt,方法
From: https://www.cnblogs.com/gagaya2/p/18280952

相关文章

  • 【CUDA】 由GPGPU控制核心架构考虑CUDA编程中线程块的分配
    GPGPU架构特点由于典型的GPGPU只有小的流缓存,因此一个存储器和纹理读取请求通常需要经历全局存储器的访问延迟加上互连和缓冲延迟,可能高达数百个时钟周期。与CPU通过巨大的工作集缓存而降低延迟不同,GPU硬件多线程提供了数以千计的并行独立线程,这些线程可以在一个多处理器内部......
  • JAVA函数式编程
    函数式编程概念,JAVA八新特性Lambda表达式和流(Stream)的使用。一、基本概念命令式编程:是一种描述计算机所需作出的行为的编程典范。主要思想是关注计算机执行的步骤,计算机则会严格遵循指令。  传统的硬件运行的机器码指令就是以命令式分格编写的。也就是对于需要实现的......
  • 掌握这些快捷键,提升你的编程效率!
    文章目录执行代码行操作移动光标查看源码编辑常用操作类操作方法操作文件操作快捷键组合结语......
  • 学懂C#编程:常用高级技术——学会C#的高级特性 LINQ
    LINQ(LanguageIntegratedQuery)是C#中的一项强大特性,它允许开发者以一种统一的方式查询和操作各种数据源,如集合、数据库、XML等。LINQ将查询功能直接集成到C#语言中,使得数据查询和操作变得更加直观和高效。LINQ的基本概念LINQ的核心思想是将数据查询表达为一种类似于SQL的查......
  • C语言编程-基于单链表实现贪吃蛇游戏
    基于单链表实现贪吃蛇游戏1.定义结构体参数蛇行走的方向蛇行走的状态蛇身节点类维护蛇的结构体型2.游戏运行前预备工作定位光标位置游戏欢迎界面绘制游戏地图(边界)初始化游戏中的蛇身创建食物3.游戏运行下一个位置是食物,就吃掉食物,释放该节点下一个位置不是......
  • 轻松调用其他工程的Python文件,提升编程效率
    哈喽,大家好,我是木头左!一、前言在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况。这种情况通常发生在需要复用已有代码或者进行模块化开发时。那么,如何实现这一目标呢?本文将为你揭晓答案。二、Python模块导入原理在Python中,可以使用import语......
  • 深入理解Qt多线程编程(QtConcurrent)
    多线程编程在现代软件开发中变得越来越重要,它能够提高应用程序的响应速度和处理性能。在Qt框架中,除了QThreadPool,QtConcurrent也是一个强大的工具,用于简化和管理多线程编程。目录概述接口详解QtConcurrent::runQtConcurrent::mapQtConcurrent::mappedQtConcurrent::filt......
  • 修改文件夹的图标、颜色和其他外观特征可以通过修改注册表、编辑系统文件或者调用 Win
    修改文件夹的图标、颜色和其他外观特征通常涉及以下底层原理和方法:注册表修改:Windows中的文件夹外观特征通常保存在注册表中。通过修改特定的注册表项,可以实现更改文件夹的图标、颜色等外观。具体来说,文件夹的外观设置通常存储在注册表路径类似于 HKEY_CURRENT_USER\Softw......
  • 深入理解 C++11 多线程编程:从入门到实践
    C++多线程编程是指使用C++提供的多线程库来并行执行代码块,从而提高程序的性能和响应能力。C++11标准引入了多线程支持,使得在C++中进行多线程编程变得更加容易和直观。以下是C++多线程编程的基本知识,并附有例子代码。多线程的基本概念线程(Thread):线程是进程中的一个执......
  • 一位Python用户编程总结
    本文分享了一位资深程序员多年编程经验的总结,涵盖了编程语言、开发工具、编程习惯、软件建模、编写过程注意事项等方面。1.编程语言选择:PythonPython语法简洁、容错率高,变量、数据类型、对象使用方便。网上免费模块丰富,安装方便,打包封装也方便。解释型语言,运行效率稍低,但足......