`
saluya
  • 浏览: 120690 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

多线程——waiting-notify机制实例(三个人打水)

 
阅读更多

//三个学生到一个水龙头下排队取水,三人都取完水后一起离开。

//这里涉及到如何判断三个人都取完水。如果用普通的静态成员,势必会要用无限循环来等待。更好的办法是用 wait-notify 机制。
//前两个学生取完水后都 wait,最后一个学生取完水后 notify,这样就能一起离开了。下面是代码示例:

package com.cs;

/**
 * 
 * @author Administrator 三个学生排队取水,取完后一起离开
 */
public class Test {

	private static final ValueLock water = new ValueLock();

	public static void main(String[] args) {
		String[] student_names = { "甲", "乙", "丙" };

		for (String student_name : student_names) {
			new Student(student_name).start();
		}
	}

	// 学生
	private static class Student extends Thread {

		private String name;

		private Student(String name) {
			this.name = name;
		}

		@Override
		public void run() {
			try {
				synchronized (water) {
					Thread.sleep(1000);

					System.out.println("学生" + name + "取完了水。");
					water.value++;

					if (water.value == 3) {
						System.out.println("三个人都取完了水。");
						water.notifyAll(); // 只要执行了这个,学生们都会离开。
					} else {
						water.wait(); // 同时释放了锁,下一个线程进入
					}
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("学生" + name + "离开了。");
		}
	}

	// 带值的锁
	private static class ValueLock {

		public int value;
	}
}
 
分享到:
评论

相关推荐

    java多线程案例——未完成

    Java多线程是Java编程中的一个重要领域,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。在这个未完成的案例中,我们可能正在探讨如何在Java中创建和管理线程,以及处理多线程环境下的并发问题。下面是...

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

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

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

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

    java多线程测试实例

    Java多线程是Java编程中的重要组成部分,尤其在并发编程领域,它扮演着...这个"java多线程测试实例"可能包含了上述部分或全部知识点的实际应用,通过下载并分析实例代码,可以加深对Java多线程编程的理解和实践能力。

    Java多线程运算集合

    - Java多线程编程涉及多个方面的知识和技术,从基本的线程创建到高级的同步机制,都是开发高效、可靠的多线程应用程序所必需的。 - 正确理解和使用这些技术对于提高程序性能、避免死锁等问题至关重要。

    Java多线程-多线程知识点总结和企业真题

    ### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...

    java多线程、锁的教程跟案例

    在Java中,多线程允许程序同时执行多个任务,提高CPU的利用率,而锁则是用来控制多线程间共享资源的访问,确保数据的一致性和完整性。 一、Java多线程 1. **线程创建方式** - 继承Thread类:自定义类继承Thread类...

    Java多线程文章系列.pdf

    - **定义**: 多线程是一种机制,允许程序中并行执行多个指令流,每个指令流称为一个线程。 - **特点**: - 线程拥有独立的执行控制,由操作系统负责调度。 - 线程没有独立的存储空间,而是与所属进程中的其他线程...

    JAVA多线程编程详解-详细操作例子

    4. **线程同步**:在多线程环境中,为了防止数据不一致性和竞态条件,Java 提供了多种同步机制,如 `synchronized` 关键字、`wait()` 和 `notify()` 方法、`ReentrantLock`、`Semaphore` 等。`synchronized` 可以...

    java多媒体与多线程处理实验

    1. **多线程程序设计**:实验要求设计一个包含四个线程的程序,通过`Thread.sleep()`模拟线程的“睡眠”和“醒来”,观察线程调度机制。 2. **Applet时间显示**:开发一个Applet程序显示时间,并具备挂起和恢复功能...

    Java多线程资料

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了软件的效率和响应性。在Java中,多线程的实现主要有两种方式:通过继承Thread类和实现Runnable接口。这篇资料深入探讨了Java多线程的相关知识...

    7Java第七单元练习题-Java多线程机制[参考].pdf

    根据提供的文件信息,可以提炼出一系列关于Java多线程机制的知识点。以下知识点均围绕Java多线程展开,并详细解释涉及的概念和组件: 1. 多线程基础概念: - Java多线程是指在Java语言中能够同时执行多个线程的...

    Java多线程编程总结

    ### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个...

    JAVA多线程学习笔记整理(csdn)————程序.pdf

    Java多线程是Java编程中的核心概念,它允许并发执行多个任务,提高程序的执行效率。以下是关于Java多线程的详细知识点: 1. **创建线程** - **继承Thread类**:创建一个新的类,该类继承自Thread类,并重写run()...

    java多线程经典案例

    Java中,可以通过wait()、notify()和notifyAll()这三个Object类的方法来实现线程间的通信。这些方法必须在同步环境中使用,否则会抛出异常。此外,Java 5引入了BlockingQueue阻塞队列,它是一种线程安全的数据结构,...

    Java多线程编程实例全书随书代码.rar

    《Java多线程编程实例全书》是一本深入探讨Java多线程编程的书籍,它提供了丰富的实例,帮助读者理解并掌握多线程的核心概念和技术。尽管这本书可能相对较老,但其中涉及的知识点仍然是Java开发中不可或缺的部分,...

    java 多线程实例

    Java多线程是Java编程中的重要概念,尤其在并发编程领域占据着核心地位。Java5引入了许多关于多线程的新特性和改进,极大地提升了多线程编程的效率和安全性。以下将详细介绍Java多线程的一些关键知识点。 1. **线程...

    java+多线程+同步详解源代码学习

    在大型系统开发中,多线程技术使得程序能够同时执行多个任务,提高系统的并发性,而同步机制则确保了在多线程环境下数据的一致性和完整性。下面将对这两个关键知识点进行深入解析。 一、Java多线程 1. **线程创建...

    JAVA 多线程讲解及实例

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,极大地提升了软件的效率和性能。在现代计算环境中,多线程已经成为必备的技能,尤其在服务器端编程、高并发应用以及实时系统中,多线程的运用更是至...

    B09多线程-1ppt课件(全).ppt

    线程的生命周期包括三个主要阶段:新建(New)、就绪(Runnable)和运行(Running)。此外,线程还可以进入阻塞(Blocked)、等待(Waiting)和终止(Terminated)状态。 - **常用常量**:`MAX_PRIORITY`(10)、`...

Global site tag (gtag.js) - Google Analytics