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

yizhihongxing

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日

相关文章

  • python 协程并发数控制

    Python协程并发数控制攻略 在Python中,协程(coroutine)可以用于实现高效的异步编程,但是并发数控制也是一个很重要的问题。如果并发数过大,会导致系统的资源消耗过多,如果并发数过小,会影响程序执行的效率。怎么样控制协程的并发数呢?下面将为大家介绍Python中协程并发数控制的攻略: 1. 使用asyncio.Semaphore Python中…

    多线程 2023年5月16日
    00
  • java并发之原子操作类和非阻塞算法

    Java并发之原子操作类和非阻塞算法 什么是原子操作类? 在Java并发编程中,一个原子操作是指一个操作是不可中断的。这意味着,当多个线程同时执行原子操作时,这些操作的执行结果一定是正确的。 Java语言提供了一些原子操作类,来简化多线程编程的开发。这些原子操作类支持一些基本的原子操作,比如读取、写入、比较和交换等。这些原子操作类保证了多线程同时执行这些操作…

    多线程 2023年5月16日
    00
  • Node.js 多线程完全指南总结

    Node.js 多线程完全指南总结 简介 Node.js是一种事件驱动的、非阻塞式I/O的JavaScript运行时环境,通常用于服务器端的编程应用。虽然Node.js主要是单线程的,但是它是支持多线程操作的。本文将详细讲解Node.js多线程的概念和指南,并附上一些示例说明。 如何创建多线程 Node.js多线程最常用的方式是使用cluster模块和chi…

    多线程 2023年5月17日
    00
  • Java编程思想中关于并发的总结

    Java编程思想中关于并发的总结 Java编程思想这本书的第二十一章讲解了关于并发的内容,本文就对其总结一下。 并发基础 Java中的线程数据结构是非常简单的,Java的线程是一种操作系统线程,Java线程维护着自己的堆栈、程序计数器和一套寄存器。 线程的主要状态有五个,分别是新建、就绪、运行、阻塞和死亡。其中“就绪”状态指线程已经准备好获取CPU,并等待C…

    多线程 2023年5月16日
    00
  • C# 多线程中经常访问同一资源可能造成哪些问题

    C# 多线程中经常访问同一资源可能造成以下问题: 竞态条件 死锁 竞态条件 当多个线程在访问同一资源时,它们可能会相互干扰,以致结果无法确定或不正确。这种情况称为“竞态条件”,很难被预先检测,常见的情况包括: 多个线程尝试同时读取和修改同一个变量 多个线程尝试同时写入同一个文件 多个线程尝试同时访问同一个网络连接 例如,考虑一个账户余额查询和转账应用。我们在…

    多线程 2023年5月16日
    00
  • iOS开发探索多线程GCD队列示例详解

    iOS开发探索多线程GCD队列示例详解 在iOS开发中,经常需要使用多线程编程来提高应用程序的性能和响应速度。而GCD(Grand Central Dispatch)则是iOS中多线程编程的一种新方式,它使用了轻量级的线程和任务调度机制,可以自动利用所有可用的CPU核心,方便易用且性能强大。 本文将针对GCD的队列进行详细讲解,包括串行队列和并发队列,并给出…

    多线程 2023年5月16日
    00
  • Python 多线程超详细到位总结

    Python 多线程超详细到位总结 什么是多线程? 多个线程的并行计算可以更快地完成一定的任务。在Python中,多线程可以在同一时间内执行多个线程。 比如,开发人员可以同时进行多个CPU密集型操作,例如访问网络,完成I/O操作或处理大量数据,而不会导致程序被阻塞。 如何使用 Python 的多线程模块? Python提供了一个标准的多线程模块——threa…

    多线程 2023年5月17日
    00
  • JavaScript多并发问题如何处理

    JavaScript多并发问题主要涉及到JavaScript的异步编程和事件循环机制。在JavaScript中,单线程的限制就意味着代码只能串行执行,而异步编程在处理I/O等IO密集型任务时,可能存在多个异步操作同时执行的情况,而这时就会出现多并发问题。 那么我们该如何解决这些多并发问题呢?以下是几个可以采用的策略: 1. 使用回调函数 在JavaScrip…

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