`

Java 多线程例子10 线程之间通信 wait notify notifyAll

阅读更多

回答问题:http://www.iteye.com/problems/46763

有三方:厂家,电脑城,顾客
厂家2个,一个生产主板,一个生产显卡。
顾客有2个,他们各自不断购买主板和显卡。
电脑城有一个,卖显卡和主板。

 

class ComputerCenter {
	private static Object VIDEO = new Object();
	private static Object MAINB = new Object();
	private static Integer videoN = 10;
	private static Integer MainbN = 10;

	public void stockVd() {
		synchronized(VIDEO) {
			if(videoN >= 20) {
				System.out.println("ComputerCenter: the VC storage is MAX");   
				try {VIDEO.wait();} catch (Exception e) {}   
			}
			System.out.println("ComputerCenter: 厂商送来一块显卡。");
			videoN++;
			VIDEO.notify();//----------------------------唤醒消费者消费
		}
	}

	public void stockMd() {
		synchronized(MAINB) {
			if(MainbN >= 20) {
				System.out.println("ComputerCenter: the MB storage is MAX");   
				try {MAINB.wait();} catch (Exception e) {}      
			}
			System.out.println("ComputerCenter: 厂商送来一块主板。");
			MainbN++;
			MAINB.notify();//-----------------------------唤醒消费者消费
		}
	}

	public void sellVd(String name) {   
		synchronized(VIDEO) {
			if(videoN <= 0) {
				System.out.println("没有显卡了,等等,马上送来!!!!!!!!!");   
				try {VIDEO.wait();} catch (Exception e) {}    
			}
			System.out.println(name + " : 买走一块显卡。");
			videoN--;
			VIDEO.notify();//----------------------------------唤醒厂商
		}
	}
	
	public void sellMd(String name)  {
		synchronized(MAINB) {
			if(MainbN <= 0) {  
				System.out.println("没有主板了,等等,马上送来!!!!!!!!!!");   
				try {MAINB.wait();} catch (Exception e) {} 
			}
			System.out.println(name + " : 买走一块主板。");
			MainbN--;
			MAINB.notify();//----------------------------------唤醒厂商
		}
	}


	public static void main(String[] args) {
		ComputerCenter MyCC = new ComputerCenter();   
		new customer(MyCC,"Jack").start();
		new customer(MyCC,"Tom").start();  
		new Md_retailer(MyCC).start();
		new Vd_retailer(MyCC).start();
	}
}

class customer extends Thread {
	private ComputerCenter cc;
	private String name;
	public customer(ComputerCenter cc,String name) {
		this.cc = cc;
		this.name = name;
	}

	public void run() {
		while(true) {
			//try {Thread.sleep(10);} catch (Exception e) {}      
			//顾客不断购买显卡和主板   
			cc.sellVd(name);	cc.sellMd(name);
		}
	}  
}
class Md_retailer extends Thread {
	private ComputerCenter cc;
	public Md_retailer(ComputerCenter cc) {
		this.cc = cc;
	}

	public void run() {
		while(true) {
			try {Thread.sleep(10);} catch (Exception e) {}      
			cc.stockMd();
		}
	}  
}
class Vd_retailer extends Thread {
	private ComputerCenter cc;
	public Vd_retailer(ComputerCenter cc) {
		this.cc = cc;
	}

	public void run() {
		while(true) {
			try {Thread.sleep(10);} catch (Exception e) {}      
			cc.stockVd();
		}
	}  
}

 上面的程序,没有考虑到,顾客a和顾客b可以相互叫醒,导致卖出的数量是负值了。

改进,等待进入后再判断。

class ComputerCenter {
	private static Object VIDEO = new Object();
	private static Object MAINB = new Object();
	private static Integer videoN = 10;
	private static Integer MainbN = 10;

	public void stockVd() {
		synchronized(VIDEO) {
			if(videoN >= 20) {
				System.out.println("ComputerCenter: the VC storage is MAX");   
				try {VIDEO.wait();} catch (Exception e) {}   
			}
			videoN++;
			System.out.println("ComputerCenter: 厂商送来一块显卡。" + videoN);
			VIDEO.notify();//----------------------------唤醒消费者消费
		}
	}

	public void stockMd() {
		synchronized(MAINB) {
			if(MainbN >= 20) {
				System.out.println("ComputerCenter: the MB storage is MAX");   
				try {MAINB.wait();} catch (Exception e) {}      
			}
			MainbN++;
			System.out.println("ComputerCenter: 厂商送来一块主板。"+MainbN);
			MAINB.notify();//-----------------------------唤醒消费者消费
		}
	}

	public void sellVd(String name) {   
		synchronized(VIDEO) {
			if(videoN <= 0) {
				System.out.println("没有显卡了,等等,马上送来!!!!!!!!!");   
				try {VIDEO.wait();} catch (Exception e) {}    
			}
			if(videoN >0) {
				System.out.println(name + " : 买走一块显卡。"+videoN);
				videoN--;
			}
			VIDEO.notify();//----------------------------------唤醒厂商
		}
	}
	
	public void sellMd(String name)  {
		synchronized(MAINB) {
			if(MainbN <= 0) {
				System.out.println("没有主板了,等等,马上送来!!!!!!!!!!");   
				try {MAINB.wait();} catch (Exception e) {} 
			}
			if(MainbN >0) {
				System.out.println(name + " : 买走一块主板。"+MainbN);
				MainbN--;
			}
			MAINB.notify();//----------------------------------唤醒厂商
		}
	}

	public static void main(String[] args) {
		ComputerCenter MyCC = new ComputerCenter();   
		new customer(MyCC,"Jack").start();
		new customer(MyCC,"Tom").start();  
		new Md_retailer(MyCC).start();
		new Vd_retailer(MyCC).start();
	}
}

class customer extends Thread {
	private ComputerCenter cc;
	private String name;
	public customer(ComputerCenter cc,String name) {
		this.cc = cc;
		this.name = name;
	}

	public void run() {
		while(true) {
			//try {Thread.sleep(10);} catch (Exception e) {}      
			//顾客不断购买显卡和主板   
			cc.sellVd(name);	cc.sellMd(name);
		}
	}  
}
class Md_retailer extends Thread {
	private ComputerCenter cc;
	public Md_retailer(ComputerCenter cc) {
		this.cc = cc;
	}

	public void run() {
		while(true) {
			try {Thread.sleep(10);} catch (Exception e) {}      
			cc.stockMd();
		}
	}  
}
class Vd_retailer extends Thread {
	private ComputerCenter cc;
	public Vd_retailer(ComputerCenter cc) {
		this.cc = cc;
	}

	public void run() {
		while(true) {
			try {Thread.sleep(10);} catch (Exception e) {}      
			cc.stockVd();
		}
	}  
}

 网友说了,这种卖电脑的叫人家来了,又可能买不到的情况存在。

class ComputerCenter {
	private static Object VIDEO = new Object();
	private static Object MAINB = new Object();
	private static Integer videoN = 10;
	private static Integer MainbN = 10;

	public void stockVd() {
		synchronized(VIDEO) {
			if(videoN >= 20) {
				System.out.println("ComputerCenter: the VC storage is MAX");   
			} else {
				videoN++;
				System.out.println("ComputerCenter: 厂商送来一块显卡。" + videoN);
				VIDEO.notify();//----------------------------唤醒消费者消费
			}
		}
	}

	public void stockMd() {
		synchronized(MAINB) {
			if(MainbN >= 20) {
				System.out.println("ComputerCenter: the MB storage is MAX");   
			} else {
				MainbN++;
				System.out.println("ComputerCenter: 厂商送来一块主板。"+MainbN);
				MAINB.notify();//-----------------------------唤醒消费者消费
			}
		}
	}

	public void sellVd(String name) {   
		synchronized(VIDEO) {
			if(videoN <= 0) {
				System.out.println("没有显卡了,等等,马上送来!!!!!!!!!");   
				try {VIDEO.wait();} catch (Exception e) {}    
			}
			System.out.println(name + " : 买走一块显卡。"+videoN);
			videoN--;
		}
	}
	
	public void sellMd(String name)  {
		synchronized(MAINB) {
			if(MainbN <= 0) {
				System.out.println("没有主板了,等等,马上送来!!!!!!!!!!");   
				try {MAINB.wait();} catch (Exception e) {} 
			}
				System.out.println(name + " : 买走一块主板。"+MainbN);
				MainbN--;
		}
	}

	public static void main(String[] args) {
		ComputerCenter MyCC = new ComputerCenter();   
		new customer(MyCC,"Jack").start();
		new customer(MyCC,"Tom").start();  
		new Md_retailer(MyCC).start();
		new Vd_retailer(MyCC).start();
	}
}

class customer extends Thread {
	private ComputerCenter cc;
	private String name;
	public customer(ComputerCenter cc,String name) {
		this.cc = cc;
		this.name = name;
	}

	public void run() {
		while(true) {
			//try {Thread.sleep(10);} catch (Exception e) {}      
			//顾客不断购买显卡和主板   
			cc.sellVd(name);	cc.sellMd(name);
		}
	}  
}
class Md_retailer extends Thread {
	private ComputerCenter cc;
	public Md_retailer(ComputerCenter cc) {
		this.cc = cc;
	}

	public void run() {
		while(true) {
			try {Thread.sleep(10);} catch (Exception e) {}      
			cc.stockMd();
		}
	}  
}
class Vd_retailer extends Thread {
	private ComputerCenter cc;
	public Vd_retailer(ComputerCenter cc) {
		this.cc = cc;
	}

	public void run() {
		while(true) {
			try {Thread.sleep(10);} catch (Exception e) {}      
			cc.stockVd();
		}
	}  
}

 

分享到:
评论

相关推荐

    源码—Java多线程5—死锁和wait notify notifyAll

    源码—Java多线程5—死锁和wait notify notifyAll

    Java 同步方式 wait和notify/notifyall

    总结一下,`wait()`, `notify()`, 和 `notifyAll()` 是Java多线程编程中的核心工具,它们与`synchronized`关键字一起,为线程间的协作提供了强大的支持。理解并熟练掌握这些概念,对于编写高效、安全的多线程程序至...

    java多线程的讲解和实战

    - 等待/通知机制:`wait()`, `notify()`, `notifyAll()`方法用于线程间的通信。这些方法必须在`synchronized`环境中使用,避免线程安全问题。 - `volatile`关键字:用于标记共享变量,确保多线程环境下的可见性和...

    java 多线程并发实例

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

    Java多线程wait和notify

    总结来说,Java的 `wait()` 和 `notify()` 提供了一种在多线程环境中控制线程执行的机制。通过合理使用这些方法,我们可以实现线程间的协作,精确控制子线程的运行状态。然而,这种方式虽然灵活,但管理起来相对复杂...

    java多线程经典案例

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

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    JAVA多线程的实例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过实现`Runnable`接口或者继承`Thread`类。 首先,让我们从创建线程开始。当你...

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

    Java多线程中wait、notify、notifyAll使用详解

    Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 一、wait()方法 wait()方法是使当前线程自动...

    java多线程代码案例(创建线程,主线程,线程优先级,线程组,线程同步,线程间的通信)

    本文将深入探讨Java多线程中的关键知识点,包括创建线程、主线程、线程优先级、线程组、线程同步以及线程间的通信。 1. **创建线程** 在Java中,可以通过两种方式创建线程:继承`Thread`类或实现`Runnable`接口。...

    JAVAJAVA多线程教学演示系统论文

    3. **线程同步与并发控制**:论文会深入讲解JAVA中的线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和ReentrantLock类的使用。此外,可能会探讨并发工具类,如Semaphore、...

    Java多线程实例图形版

    wait()、notify()和notifyAll()方法用于线程间的通信,使得线程可以等待特定条件满足后再继续执行;还有volatile关键字保证了多线程环境下的可见性和有序性,避免了线程缓存造成的数据不一致。 在这个实例中,我们...

    Java多线程实例代码

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类和实现`Runnable`接口。 1. 继承Thread类: 当你需要创建一...

    java多线程编程实例_Source

    2. 线程通信:wait()、notify()和notifyAll()方法用于线程间的通信。在生产者消费者模型或其他同步问题中,这些方法起到关键作用。 3. 线程状态:线程有新建、就绪、运行、阻塞和终止五种状态。实例可能涉及线程的...

    java之wait,notify的用法([ 详解+实例 ])

    在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object类的一个方法,用于让当前线程...

    java多线程示例

    2. wait()、notify()和notifyAll():这些方法在Object类中定义,用于线程间的通信和协作。它们必须在同步环境中使用,以避免死锁。 3. Lock接口和ReentrantLock类:Java 5引入了Lock接口,提供了比synchronized更细...

    Java多线程编程核心技术_完整版_java_

    1. wait()、notify()和notifyAll():这三个方法用于线程间的通信,它们必须在同步环境中使用。 2. Condition接口:配合Lock使用,提供更灵活的线程间通信方式。 五、线程池 1. Executor框架:Java 5引入的...

    Java多线程实现异步调用实例

    标签“多线程”强调了Java并发编程的核心概念,如线程的创建、同步、通信和状态管理。例如,`synchronized`关键字用于确保对共享资源的互斥访问,防止数据竞争;`wait()`, `notify()`和`notifyAll()`方法用于线程间...

Global site tag (gtag.js) - Google Analytics