概述
在使用synchronized进行线程同步中介绍了依赖对象锁定线程,本篇文章介绍如何依赖对象协调线程。
同synchronized悲观锁一样,线程本身不能等待与唤醒,也是需要对象才能完成等待与唤醒的操作。
本篇主题是Object等待与唤醒。
1.在Object上有定义了以下几个方法:
- public final native void notify();
唤醒等待在此对象上的线程,如果有个线程等待,随机唤醒一个线程
- public final native void notifyAll();
唤醒等待此对象上的所有线程
- public final void wait() ;
让当前运行线程等待
- public final native void wait(long timeout);
让当前线运行程等待timeout毫,直到其他线程调用notify()方法或notifyAll()方法的对象,或一个指定的时间已经过去
- public final void wait(long timeout, int nanos);
让当前运行线程等待timeout++毫秒,直到其他线程调用notify()方法或notifyAll()方法的对象,或一个指定的时间已经过去
2.代码示例
package wang.conge.javasedemo.core.thread; import java.util.Date; public class WaitAndNotifyDemo{ public static void main(String[] args){ Object mike = new Object(); new Thread(new TalkRunable("haoran_10", mike)).start(); new Thread(new TalkRunable("conge", mike)).start(); new Thread(new TalkRunable("haoran", mike)).start(); } static class TalkRunable implements Runnable{ private String name; private Object mike; public TalkRunable(String name , Object mike){ this.name = name; this.mike = mike; } @Override public void run() { while(true){ synchronized (mike) { System.out.println(name + (new Date())); mike.notifyAll(); try { mike.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } }
3.流程分析
- 讲话线程。每个线程有一个名称,通过初始化赋予
- 该线程讲话前,要先拿到mike锁
- 拿到mike锁之后,讲一句话
- 唤醒等mike锁的所有线程,执行mike.notifyAll()
- 让出当前mike锁,等待其他持有mike锁的线程唤醒
4.总结
- 在执行对象的唤醒之前,首先要获得该对象的锁。想象一下,我说我把mike让出去,我都没有mike,我怎么让出去?
- 线程本身不能协调,要通过共同持有的对象去协调唤醒或者等待
- 一个对象可以协调的线程,都是该对象参与的线程。
- 对比一下,一个对象是一个人,这个做的事情是线程,那么是这个人协调这些事情,而不是这些事情协调这个人。这个人也只能协调他做的事情,他没有参与的事情,跟他毛关系也没有。
- 这也解释了为什么notify(), wait()等函数定义在Object中,而不是Thread中。协调线程的是对象,不是线程本身,由对象持有锁,并且由对象协调线程唤醒与等待操作。
相关推荐
在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。接下来,我们将深入探讨这两个方法以及相关的...
wait()和notify()是Object类的方法,用于线程间通信,当一个线程调用wait()后,它会释放持有的锁并进入等待状态,直到其他线程调用notify()唤醒它。Lock接口和ReentrantLock提供了更细粒度的锁控制,支持可中断的...
3. 多线程等待相同信号:如果有多个线程等待同一个对象,`notify()`只能唤醒一个,因此需要设计合适的同步机制确保所有等待的线程都能得到通知。 总的来说,Java的线程通信机制为多线程环境下的协作提供了基础。...
- **`wait()`**:使当前线程进入等待状态,直到被其他线程唤醒或等待超时。 - **`notify()`**:随机唤醒一个正在等待的线程。 - **`notifyAll()`**:唤醒所有正在等待的线程。 **示例代码**: ```java ...
- **WAITING(等待)**: 线程进入等待状态,等待其他线程唤醒。 - **TIMED_WAITING(定时等待)**: 线程将在指定的时间内等待。 - **TERMINATED(终止)**: 线程已经完成运行或异常退出。 #### 五、线程的同步与...
然而,多线程环境下也会带来一系列问题,如数据不一致性、资源竞争等,因此,理解线程安全、线程同步以及等待唤醒机制至关重要。此外,单例设计模式在确保一个类只有一个实例的同时,提供了全局访问点,也是多线程...
在C#编程中,多线程是一个核心概念,它允许程序同时执行多个任务,从而提高应用程序的效率和响应性。System.Threading命名空间中的Thread类是实现多线程的基础,提供了创建、控制和管理线程的方法。本文将深入探讨C#...
3. **线程唤醒(notify/notifyAll)**:`notify()`和`notifyAll()`也是`Object`类的方法,用于唤醒处于等待状态的线程。`notify()`只唤醒一个等待的线程,而`notifyAll()`则唤醒所有等待的线程。唤醒后的线程需要...
本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是程序执行的基本单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而共享堆...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,从而提升系统效率。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。下面是对Java多线程学习的详细解析。 1. **多线程概述*...
- 等待(Waiting):线程执行`wait()`方法,等待其他线程唤醒。 - 守护(Timed Waiting):线程在等待一段时间或等待某个事件发生,如`sleep()`或`join()`。 - 结束(Terminated):线程执行完毕或被中断。 5. *...
Java的多线程是编程中的一个关键概念,特别是在并发处理和高性能应用中。本文将深入讲解如何在Java中实现多线程以及线程间的通信。 首先,我们要理解一个虚假的多线程示例。在例1中,创建了两个`TestThread`对象,...
在多线程编程中,线程的控制与协作是至关重要的。标题“唤醒阻塞休眠线程示例”和描述“如何唤醒或者退出被阻塞,休眠的线程,非TerminateXXX方法”提示我们要探讨的是如何优雅地管理线程状态,而不是粗暴地终止它们...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程可以通过实现Runnable接口或继承Thread类来创建。下面我们将深入探讨Java多线程编程的...
### 基于VC++和JAVA的多线程程序设计 #### 多线程基本概念及应用 多线程是一种编程模型,它允许程序在单个进程中创建和管理多个独立执行单元(即线程),这些线程可以在同一时间内并发执行。这种特性极大地提高了...
8. **死锁与活锁**:在多线程环境中,线程可能因为资源竞争陷入死锁(两个或更多线程相互等待对方释放资源),或者出现活锁(线程不断尝试但无法进行,如一直调整状态而不执行)。避免这些问题需要良好的设计和使用...
【Java多线程】是Java编程中不可或缺的一部分,尤其在面试场景中,了解和掌握多线程知识至关重要。以下是对标题和描述中涉及知识点的详细解释: 1. **进程与线程的区别**: - **进程**:是操作系统资源分配的基本...
在Java编程中,线程的等待唤醒机制是多线程编程中的重要概念,它涉及到如何有效地协调多个线程之间的交互,以确保程序的正确运行。本文将深入探讨这个主题,并提供一些代码优化的建议,适合Java初学者进行学习和参考...
在Java编程领域,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。《Java多线程编程实例》这本书深入浅出地探讨了Java中的多线程编程,通过丰富的实例帮助读者...