教你如何使用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日

相关文章

  • SpringBoot框架集成token实现登录校验功能

    下面是详细讲解SpringBoot框架集成token实现登录校验功能的完整攻略。 一、什么是Token 在Web开发中,服务端不能直接拿到客户端的登录状态,而客户端又需要传递一些数据,这时就需要一种机制来帮助服务端识别客户端的身份,这种机制就是Token。 Token是一种令牌,本质上就是一个字符串,客户端在登录时通过身份验证后,服务端会返回给客户端一个To…

    Java 2023年5月19日
    00
  • java实现代码统计小程序

    首先,为了实现一个Java代码统计小程序,我们需要掌握以下几个方面的知识: Java I/O 操作:Java I/O 操作可以让我们读取和写入文件内容,包括字符流和字节流两种方式。 Java 正则表达式:正则表达式可以帮助我们识别代码中的各种语句和注释,便于代码统计。 Java 集合框架:Java 集合框架中的 List、Set 等集合类型可以帮助我们存储和…

    Java 2023年5月23日
    00
  • 网站页面自动跳转实现方法PHP、JSP(下)

    下面我将详细讲解如何实现网站页面自动跳转。 1.使用PHP实现跳转 在PHP中,我们可以使用header()函数来实现页面自动跳转。该函数允许我们发送一个指定的HTTP标头到客户端浏览器,从而强制浏览器重定向到另一个页面。 以下是header()函数的语法: header("Location: 目标页面URL"); exit; 其中,Lo…

    Java 2023年6月15日
    00
  • Java字符编码简介_动力节点Java学院整理

    Java字符编码简介 什么是字符编码 在计算机中,字符是通过编码来表示的。字符编码就是一种将各种字符转换为计算机可以识别的二进制数的方法。计算机普通只能读懂二进制数,因此我们需要使用字符编码来表示文本。 常见的字符编码包括 ASCII、GB2312、GBK、UTF-8等。在Java中,用char类型表示一个字符,String类型表示一组字符,它们都是采用Un…

    Java 2023年5月19日
    00
  • 解决使用security和静态资源被拦截的问题

    解决使用security和静态资源被拦截的问题,需要对Spring Security进行相应的配置。 一、配置Spring Security可以通过以下代码块,实现对Spring Security的配置,主要是开启web_security、关闭跨域保护、开启匿名认证和对静态资源的忽略: @Configuration @EnableWebSecurity pu…

    Java 2023年5月20日
    00
  • 深入解析C#中的泛型类与泛型接口

    针对“深入解析C#中的泛型类与泛型接口”的完整攻略,我可以按照如下的思路来展开回答: 1.泛型类与泛型接口的概念解析 1.1 泛型类的定义 1.2 泛型接口的定义2.泛型类与泛型接口的优点 2.1 类型安全 2.2 代码复用 2.3 灵活性提高3.泛型类与泛型接口的使用示例 3.1 泛型类的使用示例 3.2 泛型接口的使用示例 下面,我将依次从以上三个方面进…

    Java 2023年5月19日
    00
  • 对Java字符串与整形、浮点类型之间的相互转换方法总结

    下面是“对Java字符串与整形、浮点类型之间的相互转换方法总结”的攻略。 1. Java字符串转整型 Java字符串可以通过Integer类的静态方法parseInt()实现转换成整型数据。具体语法如下: String s = "123"; int i = Integer.parseInt(s); // 这里的i值为123 同样的,如果字…

    Java 2023年5月27日
    00
  • Java持久化框架Hibernate与Mybatis优劣及选择详解

    Java持久化框架Hibernate与Mybatis优劣及选择详解 1. 什么是Java持久化框架? Java持久化框架是为了简化Java应用程序与关系型数据库之间数据交互的过程所设计的一套框架。通过使用Java持久化框架,在Java应用程序中可以通过对象来操作数据库,这样可以实现面向对象编程与关系型数据库的无缝对接。 2. Hibernate与Mybati…

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