java基本教程之java线程等待与java唤醒线程 java多线程教程

Java线程等待与唤醒线程

线程等待

线程等待就是让线程先暂停一下,等待特定的条件被满足时再继续执行,一般情况下会使用wait()方法进行线程等待。

wait()方法的用法:

synchronized(monitorObject) {
    while(!conditionWarranted()) {
        monitorObject.wait();
}

代码中的monitorObject表示该操作的监视器,一般是某个对象;而conditionWarranted()则是等待条件的方法,返回true表示条件被满足,返回false则表示线程需要继续等待。使用wait()方法时需要注意以下三点:

  1. wait()方法只能在同步代码块或同步方法中使用。
  2. 在等待之前,应该先判断等待的条件是否已经满足,如示例代码中的while(!conditionWarranted())
  3. 线程在等待时会释放锁,等待醒来后需要重新获取锁再继续执行。

唤醒线程

当等待条件被满足时,可以使用notify()notifyAll()方法唤醒等待的线程。

notify()方法会随机唤醒一个等待的线程,而notifyAll()会唤醒所有等待的线程。需要注意以下几点:

  1. notify()notifyAll()方法同样只能在同步代码块或同步方法中使用,并且需要获取到与wait()方法中使用的同一把锁。
  2. 唤醒线程需要等待当前线程释放锁后才能执行。

示例说明1

public class ThreadDemo {
    public static void main(String[] args) {
        final Object monitorObject = new Object();
        Thread threadA = new Thread(() -> {
            synchronized(monitorObject) {
                try {
                    System.out.println("Thread A is waiting.");
                    monitorObject.wait();
                    System.out.println("Thread A is awakened.");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread threadB = new Thread(() -> {
            synchronized(monitorObject) {
                System.out.println("Thread B is running.");
                monitorObject.notify();
                System.out.println("Thread B notified.");
            }
        });
        threadA.start();
        threadB.start();
    }
}

上面示例代码中,创建了两个线程threadAthreadBthreadA负责等待monitorObject对象的唤醒,threadB则会在执行过程中唤醒等待的线程。

输出结果为:

Thread A is waiting.
Thread B is running.
Thread B notified.
Thread A is awakened.

示例说明2

public class ThreadDemo {
    public static void main(String[] args) {
        final Object monitorObject = new Object();
        Thread threadA = new Thread(() -> {
            synchronized(monitorObject) {
                try {
                    System.out.println("Thread A is waiting.");
                    monitorObject.wait();
                    System.out.println("Thread A is awakened.");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread threadB = new Thread(() -> {
            synchronized(monitorObject) {
                System.out.println("Thread B is running.");
                monitorObject.notifyAll();
                System.out.println("Thread B notified all.");
            }
        });
        Thread threadC = new Thread(() -> {
            synchronized(monitorObject) {
                try {
                    System.out.println("Thread C is waiting.");
                    monitorObject.wait();
                    System.out.println("Thread C is awakened.");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        threadA.start();
        threadB.start();
        threadC.start();
    }
}

上面示例代码中,同样是创建了三个线程,threadAthreadC等待monitorObject对象唤醒,threadB唤醒所有等待的线程。

输出结果为:

Thread A is waiting.
Thread B is running.
Thread C is waiting.
Thread B notified all.
Thread C is awakened.
Thread A is awakened.

从输出结果可以看出,threadB成功唤醒了所有等待monitorObject对象的线程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java基本教程之java线程等待与java唤醒线程 java多线程教程 - Python技术站

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

相关文章

  • 如何使用Python多线程测试并发漏洞

    如何使用Python多线程测试并发漏洞 前言 在对一个web应用进行安全测试时,多线程测试并发漏洞是常用的一种方式。在本文中,我们将会讲解使用Python进行多线程测试并发漏洞的步骤。 准备工作 在进行多线程测试并发漏洞之前,需要掌握以下知识: Python基础知识 Python多线程编程 Web安全测试知识 确保你已经掌握了以上知识后,我们可以开始进入正文…

    多线程 2023年5月16日
    00
  • 15个高级Java多线程面试题及回答

    15个高级Java多线程面试题及回答 本文将详细介绍 15 个高级 Java 多线程面试题及回答,以下是题目列表: 在 Java 中,什么是线程死锁,如何避免死锁? 什么是线程池,在多线程编程中,为什么要使用线程池? 请解释 synchronized 和 volatile 关键字的用途。 从编程的角度来看,什么是竞态条件? 如何在 Java 中实现可重入锁?…

    多线程 2023年5月16日
    00
  • Java并发之synchronized实现原理深入理解

    Java并发之synchronized实现原理深入理解 概述 Java中,synchronized关键字是实现多线程同步的一种重要机制,可以让代码块以原子性、独占性执行。在并发编程中,对synchronized的理解非常重要。本文将深入讲解synchronized的实现原理,包括synchronized的底层实现、锁升级机制等方面。 synchronized…

    多线程 2023年5月16日
    00
  • Java8 CompletableFuture 异步多线程的实现

    下面就详细讲解Java8 CompletableFuture的异步多线程实现。 一、什么是CompletableFuture CompletableFuture 是 Java 异步编程的一种实现,它是 Java8 引入的一个类,可以用于多线程的异步处理,能够以更加简洁的方式来编写并发代码。 相对于传统的线程池,CompletableFuture 的优势在于它…

    多线程 2023年5月17日
    00
  • GC算法实现篇之并发标记清除

    GC算法实现篇之并发标记清除 简述 并发标记清除是一种适用于堆内存的垃圾回收算法,通常用于大型的应用程序或者需要长时间运行的应用程序中。其主要的特点是多线程标记和清除,相对于其他垃圾回收算法,具备了更好的性能表现。 基本流程 并发标记清除的基本流程如下: 初始状态:堆中的所有对象都被标记为“未标记” 初始标记:从根对象开始,对所有可达的对象进行标记。该过程是…

    多线程 2023年5月16日
    00
  • Mysql的并发参数调整详解

    Mysql的并发参数调整详解 什么是Mysql并发参数? Mysql并发参数是指Mysql数据库在处理并发请求时所需要的一组参数。Mysql并发参数可以控制Mysql对并发请求的响应,包括线程数量、锁等待时间、缓存命中率等等。 Mysql并发参数调整的重要性 Mysql并发参数的调整对性能的影响非常大。如果不合理的设置并发参数会导致Mysql的性能下降甚至瘫…

    多线程 2023年5月16日
    00
  • 在apache下限制每个虚拟主机的并发数!!!!

    在 Apache 下限制每个虚拟主机的并发数可以通过修改 Apache 的配置文件实现。具体步骤如下: 打开 Apache 的配置文件 httpd.conf,找到以下两行内容: #LoadModule status_module modules/mod_status.so #ExtendedStatus On 取消注释并保存,使得服务器状态模块加载并开启扩展…

    多线程 2023年5月17日
    00
  • go并发编程sync.Cond使用场景及实现原理

    关于“go并发编程sync.Cond使用场景及实现原理”的完整攻略,我将分成以下几个部分进行说明: sync.Cond简介 sync.Cond使用场景 sync.Cond实现原理 示例说明 1. sync.Cond简介 sync.Cond是go语言标准库中的一个并发编程工具,用于在多个goroutine之间传递信号和通知。它是基于互斥锁(mutex)和条件变…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部