教你如何使用Java多线程编程LockSupport工具类

yizhihongxing

教你如何使用Java多线程编程LockSupport工具类

什么是LockSupport

LockSupport是JavaSE 5引入的一个工具类,用于线程的阻塞和唤醒。它可以在任何时刻,让一个正在运行的线程阻塞或者唤醒它。

LockSupport的使用

park()方法

LockSupport类下的park方法可以阻塞线程,直到调用它的unpark方法或者被中断。

public static void park();

例如:

public void test1() {
    Thread thread = Thread.currentThread();
    System.out.println("thread start...");
    LockSupport.park();
    System.out.println("thread end...");
}

这个线程在执行到LockSupport.park()方法时会阻塞,直到别的线程调用了它的unpark方法。

unpark()方法

unpark方法可以唤醒指定的线程。如果先调用了unpark方法,再调用park方法,则不会被阻塞。

public static void unpark(Thread thread);

例如:

public void test2() {
    Thread thread = Thread.currentThread();
    System.out.println("thread start...");
    LockSupport.unpark(thread);
    System.out.println("thread end...");
}

这个线程执行到LockSupport.unpark()方法后,即使后面有LockSupport.park()方法,也不会被阻塞。

中断响应

LockSupport工具类不会抛出InterruptedException异常,但可以响应中断。

例如:

public void test3() {
    Thread thread = Thread.currentThread();
    System.out.println("thread start...");
    try {
        Thread.sleep(5000); // sleep 5s 让线程阻塞
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    LockSupport.park();
    System.out.println("thread end...");
}

如果在这个线程被阻塞时,调用了它的interrupt方法,那么它会把中断标志设为true,但是LockSupport.park()方法并不会抛出InterruptedException异常。因此需要在LockSupport.park()方法所在的代码中判断中断标志,然后退出线程。

例如:

public void test4() {
    Thread thread = Thread.currentThread();
    System.out.println("thread start...");
    try {
        Thread.sleep(5000); // sleep 5s 让线程阻塞
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    LockSupport.park();
    if (thread.isInterrupted()) {
        System.out.println("Thread is interrupted!");
    }
    System.out.println("thread end...");
}

这样就可以在阻塞中响应中断了。

示例说明

示例一

public void test5() {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("thread start...");
            LockSupport.park(); // 线程阻塞
            System.out.println("thread end...");
        }
    });
    thread.start(); // 启动线程
    try {
        Thread.sleep(3000); // sleep 3s
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    LockSupport.unpark(thread); // 唤醒线程
}

这个例子中,新建一个线程,首先启动线程,等待3s后唤醒线程,然后线程继续执行。

结果输出:

thread start...
thread end...

解释:线程阻塞时等待被唤醒,3s后主线程唤醒该线程,该线程恢复执行,然后直接执行到结束语句。

示例二

public void test6() throws InterruptedException {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("thread start...");
            LockSupport.park(); // 线程阻塞
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Thread is interrupted!");
            }
            System.out.println("thread end...");
        }
    });
    thread.start(); // 启动线程
    thread.interrupt(); // 中断线程
    thread.join(); // 等待线程结束
}

这个例子中,新建一个线程,首先启动线程,然后中断线程,最后等待线程结束。

结果输出:

thread start...
Thread is interrupted!
thread end...

解释:线程阻塞时被中断,判断到中断标志,然后退出线程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:教你如何使用Java多线程编程LockSupport工具类 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • Java实现mybatis批量插入数据到Oracle

    下面我来详细讲解“Java实现mybatis批量插入数据到Oracle”的完整攻略。 一、项目依赖 在项目的pom.xml文件中添加以下依赖: <!– MyBatis –> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybat…

    Java 2023年5月20日
    00
  • Java String中移除空白字符的多种方式汇总

    让我来为你详细讲解如何移除Java String中的空格字符吧。 什么是空白字符 在Java中,空白字符是指空格字符(’ ‘)、制表符(’\t’)、回车符(’\r’)和换行符(’\n’)这几种字符,这些字符都不能显示出来。 接下来将介绍Java中移除空白字符的多种方式。 方法一:使用replaceAll()方法 Java中可以使用replaceAll()方法…

    Java 2023年5月27日
    00
  • JAVA实现连接本地打印机并打印文件的实现代码

    Java实现连接本地打印机并打印文件的实现代码需要以下步骤: 步骤一:导入打印相关的依赖库 Java中的javax.print包提供了打印相关的API,需要在项目中导入此包相关的依赖,可以使用Maven等方式进行导入。 步骤二:获取系统中支持的打印机 可以通过javax.print.PrintServiceLookup类的lookupPrintService…

    Java 2023年5月19日
    00
  • Spring Boot全局统一异常处理器

    Spring Boot全局统一异常处理器 在Spring Boot应用中,处理异常是一个非常重要的问题,因为不处理异常会导致程序出现问题。为了避免应用程序因异常而出现问题,我们需要使用一个全局统一异常处理器。 配置 在 Spring Boot 应用中,需要定义一个 @ControllerAdvice 注解的异常处理类,如下所示: @ControllerAdv…

    Java 2023年5月27日
    00
  • java程序员如何编写更好的单元测试的7个技巧

    下面是针对”Java程序员如何编写更好的单元测试的7个技巧”的一份攻略。 技巧1:拆分单元测试 单元测试应该足够小,以至于一个单元测试只需要测试一个方法或函数。这样使得测试容易重复、快速执行和简单调试。拆分单元测试也使测试更精确,因为每个单元测试只测试一个输入和输出组合。 示例: 以下是一个简单的 Java 类,将两个整数相加并返回结果: public cl…

    Java 2023年5月20日
    00
  • Java实现联系人管理系统

    Java实现联系人管理系统完整攻略 系统简介 联系人管理系统,是一个用于管理个人或组织内部联系人的工具。一般包含添加联系人、编辑联系人、删除联系人、查看联系人等功能。本文介绍如何使用Java语言实现一个简单的联系人管理系统。 开发环境 JDK 8 Eclipse 或者 IntelliJ IDEA Tomcat 7 MySQL 5.7 所需技术 Servlet…

    Java 2023年5月30日
    00
  • WebService教程详解(一)

    “WebService教程详解(一)”是一篇关于Web服务的教程。本文的内容主要包括以下几部分: 一、Web服务简介 这一部分介绍了Web服务的概念和原理。其中,Web服务是指在Web上使用标准化协议进行通信的应用程序。Web服务的原理是通过HTTP协议进行通信,使用XML格式进行数据交换。 二、Web服务的类型 这一部分介绍了Web服务的四种类型:SOAP…

    Java 2023年5月26日
    00
  • Tomcat配置https SSL证书的项目实践

    下面我将详细讲解关于Tomcat配置https SSL证书的完整攻略,包含整个步骤和相关代码示例。 准备工作 通过证书颁发机构获取SSL证书,得到包含证书内容和私钥内容的文件,通常为.pfx、.p12或.pem格式。 将证书导出为JKS格式,JKS格式是Java KeyStore的缩写,它是Java系统中常用的密钥库格式。 keytool -importke…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部