`
haoran_10
  • 浏览: 444130 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

多线程(3)-基于Object的线程等待与唤醒

阅读更多

概述

使用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中。协调线程的是对象,不是线程本身,由对象持有锁,并且由对象协调线程唤醒与等待操作。
1
1
分享到:
评论

相关推荐

    JAVA线程高级-线程按序交替执行

    在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...

    java多线程源码-source

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。接下来,我们将深入探讨这两个方法以及相关的...

    【IT十八掌徐培成】Java基础第17天-05.多线程复制-多条跟踪.zip

    wait()和notify()是Object类的方法,用于线程间通信,当一个线程调用wait()后,它会释放持有的锁并进入等待状态,直到其他线程调用notify()唤醒它。Lock接口和ReentrantLock提供了更细粒度的锁控制,支持可中断的...

    java 多线程-线程通信实例讲解

    3. 多线程等待相同信号:如果有多个线程等待同一个对象,`notify()`只能唤醒一个,因此需要设计合适的同步机制确保所有等待的线程都能得到通知。 总的来说,Java的线程通信机制为多线程环境下的协作提供了基础。...

    Java多线程-线程间的通信

    - **`wait()`**:使当前线程进入等待状态,直到被其他线程唤醒或等待超时。 - **`notify()`**:随机唤醒一个正在等待的线程。 - **`notifyAll()`**:唤醒所有正在等待的线程。 **示例代码**: ```java ...

    Java多线程小结

    - **WAITING(等待)**: 线程进入等待状态,等待其他线程唤醒。 - **TIMED_WAITING(定时等待)**: 线程将在指定的时间内等待。 - **TERMINATED(终止)**: 线程已经完成运行或异常退出。 #### 五、线程的同步与...

    27_多线程_第2天(线程安全、线程同步、等待唤醒机制、单例设计模式)_讲义

    然而,多线程环境下也会带来一系列问题,如数据不一致性、资源竞争等,因此,理解线程安全、线程同步以及等待唤醒机制至关重要。此外,单例设计模式在确保一个类只有一个实例的同时,提供了全局访问点,也是多线程...

    C#多线程学习 Thread类使用 线程等编程方法

    在C#编程中,多线程是一个核心概念,它允许程序同时执行多个任务,从而提高应用程序的效率和响应性。System.Threading命名空间中的Thread类是实现多线程的基础,提供了创建、控制和管理线程的方法。本文将深入探讨C#...

    Java消费者生产者|线程等待线程唤醒WaitNotifyDemo

    3. **线程唤醒(notify/notifyAll)**:`notify()`和`notifyAll()`也是`Object`类的方法,用于唤醒处于等待状态的线程。`notify()`只唤醒一个等待的线程,而`notifyAll()`则唤醒所有等待的线程。唤醒后的线程需要...

    java 多线程并发实例

    本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是程序执行的基本单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而共享堆...

    Java 多线程学习总结归纳(附代码)

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,从而提升系统效率。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。下面是对Java多线程学习的详细解析。 1. **多线程概述*...

    java多线程测试实例

    - 等待(Waiting):线程执行`wait()`方法,等待其他线程唤醒。 - 守护(Timed Waiting):线程在等待一段时间或等待某个事件发生,如`sleep()`或`join()`。 - 结束(Terminated):线程执行完毕或被中断。 5. *...

    彻底明白Java的多线程-线程间的通信.doc

    Java的多线程是编程中的一个关键概念,特别是在并发处理和高性能应用中。本文将深入讲解如何在Java中实现多线程以及线程间的通信。 首先,我们要理解一个虚假的多线程示例。在例1中,创建了两个`TestThread`对象,...

    唤醒阻塞休眠线程示例

    在多线程编程中,线程的控制与协作是至关重要的。标题“唤醒阻塞休眠线程示例”和描述“如何唤醒或者退出被阻塞,休眠的线程,非TerminateXXX方法”提示我们要探讨的是如何优雅地管理线程状态,而不是粗暴地终止它们...

    java多线程编程实例 (源程序)

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程可以通过实现Runnable接口或继承Thread类来创建。下面我们将深入探讨Java多线程编程的...

    基于VC++和JAVA的多线程程序设计

    ### 基于VC++和JAVA的多线程程序设计 #### 多线程基本概念及应用 多线程是一种编程模型,它允许程序在单个进程中创建和管理多个独立执行单元(即线程),这些线程可以在同一时间内并发执行。这种特性极大地提高了...

    Java多线程编程

    8. **死锁与活锁**:在多线程环境中,线程可能因为资源竞争陷入死锁(两个或更多线程相互等待对方释放资源),或者出现活锁(线程不断尝试但无法进行,如一直调整状态而不执行)。避免这些问题需要良好的设计和使用...

    java多线程

    【Java多线程】是Java编程中不可或缺的一部分,尤其在面试场景中,了解和掌握多线程知识至关重要。以下是对标题和描述中涉及知识点的详细解释: 1. **进程与线程的区别**: - **进程**:是操作系统资源分配的基本...

    Java 等待唤醒机制 代码优化

    在Java编程中,线程的等待唤醒机制是多线程编程中的重要概念,它涉及到如何有效地协调多个线程之间的交互,以确保程序的正确运行。本文将深入探讨这个主题,并提供一些代码优化的建议,适合Java初学者进行学习和参考...

    《Java多线程编程实例》随书源码

    在Java编程领域,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。《Java多线程编程实例》这本书深入浅出地探讨了Java中的多线程编程,通过丰富的实例帮助读者...

Global site tag (gtag.js) - Google Analytics