Java多线程基础 线程的等待与唤醒(wait、notify、notifyAll)

Java多线程基础 线程的等待与唤醒

什么是线程的等待与唤醒

Java中通过wait(), notify()以及notifyAll()方法实现了线程的等待与唤醒功能。wait是指线程处于阻塞状态,等待其他线程的通知才能继续执行;notify和notifyAll则是唤醒等待的线程。

wait(), notify()以及notifyAll()的使用方法

这三个方法都是Object类的成员方法,最基本的用法如下:

  1. wait()方法:

public final void wait() throws InterruptedException

等待其他线程的通知,将当前线程置于等待状态,直到其他线程调用该对象的notify或notifyAll方法唤醒该线程。当其他线程调用notify()或notifyAll()方法时,当前线程不一定会马上得到执行,只有获取了对象的锁后才能执行,所以使用wait()通常都放在synchronized同步代码块中。

  1. notify()方法:

public final void notify()

唤醒在当前对象锁上等待的单个线程,如果有多个线程在等待,则唤醒其中一个线程,但具体唤醒哪个线程是不确定的。

  1. notifyAll()方法:

public final void notifyAll()

唤醒在当前对象锁上等待的所有线程。

示例1

下面的示例演示了如何使用wait()和notify()方法实现线程的等待和唤醒。这里使用了两个线程,一个线程负责计算,另一个线程在计算完成时负责打印结果。

public class WaitAndNotifyExample {
    public static void main(String[] args) {
        final Calculator calculator = new Calculator();
        // 创建一个线程,用于计算
        Thread t1 = new Thread() {
            @Override
            public void run() {
                synchronized (calculator) {
                    calculator.calculate();
                    // 计算完成后,唤醒等待的线程
                    calculator.notify();
                }
            }
        };
        // 创建一个线程,用于打印结果
        Thread t2 = new Thread() {
            @Override
            public void run() {
                synchronized (calculator) {
                    try {
                        // 等待计算完成
                        calculator.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("result: " + calculator.getResult());
                }
            }
        };
        t1.start();
        t2.start();
    }
}

class Calculator {
    private int result;

    public void calculate() {
        for (int i = 0; i < 100000000; i++) {
            result += i;
        }
    }

    public int getResult() {
        return result;
    }
}

示例2

下面的示例演示了如何使用wait()和notifyAll()方法实现阻塞队列,当队列为空时,获取队列元素的线程会进入等待状态,当队列中有元素时,会唤醒等待的线程。

import java.util.LinkedList;

public class BlockingQueueExample {
    private LinkedList queue = new LinkedList();
    private int limit = 10;

    public synchronized void put(Object item) throws InterruptedException {
        while (queue.size() == limit) {
            // 队列已满,进入等待状态
            wait();
        }
        if (queue.isEmpty()) {
            // 队列为空,需要唤醒等待的线程
            notifyAll();
        }
        queue.addLast(item);
    }

    public synchronized Object take() throws InterruptedException {
        while (queue.isEmpty()) {
            // 队列为空,进入等待状态
            wait();
        }
        if (queue.size() == limit) {
            // 队列已满,需要唤醒添加元素的线程
            notifyAll();
        }
        return queue.removeFirst();
    }
}

以上就是关于Java多线程基础 线程的等待与唤醒的完整攻略,包含了wait(),notify()以及notifyAll()的使用方法,并且给出了两个示例供大家参考。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程基础 线程的等待与唤醒(wait、notify、notifyAll) - Python技术站

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

相关文章

  • Java 并发编程ArrayBlockingQueue的实现

    Java 并发编程 ArrayBlockingQueue 的实现 ArrayBlockingQueue 简介 java.util.concurrent.ArrayBlockingQueue<E> 是 Java 并发编程中的一个阻塞队列,它实现了 BlockingQueue<E> 接口,具有线程安全、高性能、阻塞等特点,由数组实现。 下…

    多线程 2023年5月16日
    00
  • 详解Java多线程与并发

    详解Java多线程与并发攻略 Java多线程与并发是Java编程中非常重要的一个部分,它可以提高程序的效率和运行速度。本文将详细介绍Java多线程与并发的相关知识和技巧。包括线程创建、线程安全、synchronized关键字、volatile关键字等。 线程创建 Java创建线程的方法有两种: 继承Thread类并重写run()方法。 示例代码: publi…

    多线程 2023年5月16日
    00
  • python3爬虫中多线程进行解锁操作实例

    下面是详细讲解“python3爬虫中多线程进行解锁操作实例”的完整攻略。 1.什么是多线程 多线程是指同时执行多个线程。多线程能够很好地提高程序的效率,因为在程序执行过程中,如果发生了耗时的操作,比如等待用户输入、文件读写操作、网络数据的传输等,传统的程序会一直等待,造成CPU资源的浪费。而使用多线程可以使得这些操作在后台进行,不会阻塞主线程,提高了程序的响…

    多线程 2023年5月16日
    00
  • 在Go中构建并发TCP服务器

    针对“在Go中构建并发TCP服务器”的完整攻略,我为您提供以下内容: 1. 概述 在Go语言中,可以使用标准库net和net/http来轻松地构建TCP和HTTP服务器。在本文中,我们将介绍如何使用net库来构建并发TCP服务器。下面,将逐步介绍TCP服务器的实现步骤。 2. 步骤 步骤1:导入必要的包 既然我们要使用Go语言中的net库,因此在首个步骤中,…

    多线程 2023年5月17日
    00
  • Thread线程的基础知识及常见疑惑点总结

    下面是关于”Thread线程的基础知识及常见疑惑点总结”的完整攻略,包括定义、使用方法、常见疑惑点等。 1. Thread线程的定义 线程是程序中一个单一的顺序执行路径,程序中有多个线程共同执行,每个线程都有自己的任务,所有线程都共享同一块内存空间。 简单来说,线程就是在单个程序中同时运行多项任务的方式,最终完成程序的所有任务。 2. Thread线程的使用…

    多线程 2023年5月16日
    00
  • C#多线程系列之线程通知

    C#多线程系列之线程通知主要涵盖三个部分:Monitor、AutoResetEvent和ManualResetEvent。 Monitor 在C#中,Monitor类是一种基本的同步机制,支持两种操作:Enter()和Exit()。Enter()用于请求获取对象的锁,而Exit()用于释放对象的锁,最终达到线程同步的目的。 Monitor类的典型应用场景是在…

    多线程 2023年5月17日
    00
  • 你的服务器IIS最大并发数有多少?

    回答: 你的服务器IIS最大并发数有多少? IIS是运行在Windows上的一个Web 服务器,它的最大并发数是指同时可以处理的请求数量。那么,如何查看你的服务器IIS的最大并发数呢?以下是方法: 方法一:在IIS管理器中查看 打开IIS管理器,选择你的站点。 在站点主窗口中,双击“限制”,在“方法”下选择“连接限制”。 在“连接限制”对话框中,可以看到“最…

    多线程 2023年5月16日
    00
  • C++中线程池ThreadPool源码解析

    C++中线程池ThreadPool源码解析 线程池ThreadPool的概念和作用 线程池ThreadPool的作用是管理和复用线程,减少线程的创建和销毁对时间和资源的消耗,提高程序的执行效率和性能。线程池由一组可重用的线程构成,线程生命周期由线程池管理,充分利用CPU资源,提高任务处理速度。 线程池ThreadPool在并发编程中应用广泛,被用于处理网络请…

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