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日

相关文章

  • MySQL系列之十 MySQL事务隔离实现并发控制

    MySQL事务隔离实现并发控制是MySQL数据库中非常重要的一个功能,它能够实现对并发事务的隔离,避免出现并发访问数据库时的数据一致性问题。本文将为读者介绍MySQL事务隔离的基本概念、实现方式及其使用方法。 MySQL事务隔离的基本概念 MySQL事务隔离是指通过数据库隔离等级(Isolation Level)来实现多个并发事务间互不影响的机制。在MySQ…

    多线程 2023年5月16日
    00
  • Linux并发执行很简单,这么做就对了

    作为一个网站作者,我非常乐意为你详细讲解“Linux并发执行很简单,这么做就对了”这个主题。 一、什么是并发执行? 并发执行指的是多个任务在同一时间段内同时运行。在计算机系统中,它通常用于提高程序的运行效率,优化资源利用率和缩短执行时间,可以有效地提高系统的性能。 二、如何在Linux中进行并发执行? 在Linux中,实现并发执行通常有以下几种方法: 1. …

    多线程 2023年5月16日
    00
  • python支持多线程的爬虫实例

    下面是详细讲解“Python支持多线程的爬虫实例”的攻略: 准备工作 安装Python。可从官网(https://www.python.org/downloads/)下载适用于您的操作系统的Python版本。 安装必要的包:requests, beautifulsoup4, lxml,它们可通过pip命令进行安装。 bash pip install requ…

    多线程 2023年5月16日
    00
  • 关于SpringBoot 使用 Redis 分布式锁解决并发问题

    关于SpringBoot使用Redis分布式锁解决并发问题的攻略可以分为以下几个步骤: 第一步:引入Redis相关依赖 在开发SpringBoot应用时,我们需要在pom.xml文件中添加对Redis的支持,可以参考下面的依赖: <dependency> <groupId>org.springframework.boot</gr…

    多线程 2023年5月16日
    00
  • 带你快速搞定java多线程(3)

    当我们需要处理一些比较消耗时间的操作时,多线程可以提高程序的执行效率,因此实现多线程在Java编程中也显得尤为重要。本文将带你从多方面快速搞定Java多线程,实现多任务并发执行。 1. 创建线程的三种方式 在Java中,创建线程的方式有三种:继承Thread类、实现Runnable接口以及使用线程池。 1.1 继承Thread类 继承Thread类是最简单的…

    多线程 2023年5月17日
    00
  • Java 线程对比(Thread,Runnable,Callable)实例详解

    Java 线程对比(Thread,Runnable,Callable)实例详解 介绍 Java线程(Thread)是Java程序中运行的最小单元,是实现并发编程的基础。在Java中,创建线程一般有三种方式:继承Thread类、实现Runnable接口和实现Callable接口。本文将对这三种方式进行详细比较,并提供示例说明。 Thread类 继承Thread…

    多线程 2023年5月17日
    00
  • Java实现基于NIO的多线程Web服务器实例

    下面是Java实现基于NIO的多线程Web服务器实例的完整攻略: 简介 NIO是Java中提供的非阻塞IO的方式,它通过异步通知的方式,实现了单线程轮询多个Channel的IO操作,避免了阻塞,提高IO操作的效率。在Web服务器开发中,NIO可以提供更好的IO性能和更高的并发处理能力。 实现步骤 1. 初始化服务器 首先,我们需要启动服务器并初始化相关的参数…

    多线程 2023年5月16日
    00
  • Go语言中并发的工作原理

    Go语言是一门支持并发的编程语言,通过goroutine和channel两种核心机制实现并发编程。下面分以下步骤详细讲解Go语言中并发的工作原理。 1. goroutine goroutine是Go语言实现并发的基本单位。它类似于线程,但相较于线程开销更小,能够更好地利用多核心CPU的优势。与线程不同的是,Goroutine通过Go语言的运行时系统进行调度,…

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