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

教你如何使用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中的Valid和Validated的比较内容

    当我们进行Java Bean校验时,通常会使用Hibernate提供的校验框架。Valid和Validated是该框架中最常用的两种表单验证注解,它们都是用于指定校验组,在校验时都可以用来限制哪些校验组中的校验规则生效。但是,它们有一些区别。下面我将详细讲解Java中Valid和Validated的比较内容,帮助读者理解它们的使用方法。 Valid注解 @V…

    Java 2023年5月20日
    00
  • 浅谈在Java中JSON的多种使用方式

    浅谈在Java中JSON的多种使用方式 什么是JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,其来源于JavaScript. 通常用于将结构化数据序列化为文本格式,可以轻松地在不同的系统中传递、存储和分析数据. JSON将数据表达为键值对的集合,具有易于阅读和编写的文本格式,易于机器解析和生成,并且良好…

    Java 2023年5月26日
    00
  • Javaweb使用Maven工具与Tomcat的方法详解

    Javaweb使用Maven工具与Tomcat的方法详解 什么是Maven? Maven是一个Java项目管理工具,它可以帮助我们管理项目的依赖,构建,测试等工作。 为什么需要Maven? 抽象依赖关系,易于维护 统一构建方式,减少人为出错 有助于代码重用 前置条件 在开始Maven项目之前,您需要做一些准备工作: 安装Java JDK 安装Apache M…

    Java 2023年5月20日
    00
  • Java内存溢出的原因是什么?

    下面是详细讲解 Java 内存溢出的原因和解决方案的使用攻略。 什么是 Java 内存溢出? Java 内存溢出是指在 Java 应用程序中,当程序需要更多的内存空间时,系统无法分配足够的内存空间,导致程序崩溃的问题。Java 内存溢出通常是由于应用程序中存在内存泄漏或者大量占用内存的对象导致的。 Java 内存溢出的原因是什么? Java 内存溢出的原因主…

    Java 2023年5月11日
    00
  • 浅析java中print和println的区别

    浅析Java中print和println的区别 简介 在Java中,print和println是两个常用的输出语句,用于将内容输出到控制台。虽然它们看起来相似,但实际上它们有一些重要的区别。 本文将详细讲解print和println两个输出语句的区别,并通过示例加以说明。 区别 print Java中的print语句用于将给定的文本字符串打印到控制台。它不会…

    Java 2023年5月26日
    00
  • Java实现统计文档中关键字出现的次数

    为了实现统计文档中关键字出现的次数,我们需要以下步骤: 步骤一:获取文档内容 首先,我们需要读取文档中的内容,可以使用Java中的File类来进行文件的读取,示例代码如下: File file = new File("example.txt"); try { BufferedReader br = new BufferedReader(n…

    Java 2023年5月29日
    00
  • Java13 明天发布(最新最全新特性解读)

    Java13 发布攻略 Java13 于 2019年9月17日发布,在这篇文档中,我们将介绍 Java13 的最新特性。 1. 新特性 以下是 Java13 中的一些新特性: 1.1 Switch 表达式 Java 13 可以使用新的关键字 yield 或 -> 来作为 switch 表达式的返回值。这使得代码更加简洁。 下面是一个例子: public…

    Java 2023年5月19日
    00
  • Spring EL表示式的运用@Value说明

    下面是关于Spring EL表达式的运用@Value说明的完整攻略。 什么是Spring EL表达式 Spring EL表达式是Spring框架提供的一个表达式语言,可以用于从属性文件中获取配置项、注入Bean属性值等场景,具有简洁灵活的特点。例如,可以通过${}语法访问在Spring应用程序上下文中定义的属性。 基础语法 Spring EL表达式的基础语法…

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