`

Java中 synchronize、wait和notify2

阅读更多
有一个生产者消费者实例,修改了一下,觉得还行,javaeye上有类似的代码。

Producer.java
package com.java.lang.thread.produce_consume;

import java.util.Random;

public class Producer extends Thread {
	private Warehouse warehousec;

	public Producer(Warehouse warehouse) {
		this.warehousec = warehouse;
	}

	public void run() {
		Random random = new Random();
		int num = 0;
		for (;;) {
			try {
				Thread.sleep(500); // 生产速度
				num = 1 + random.nextInt(10);
				warehousec.put(num);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}
}



Consumer.java
package com.java.lang.thread.produce_consume;

import java.util.Random;

public class Consumer extends Thread {
	private Warehouse warehouse;

	public Consumer(Warehouse warehouse) {
		this.warehouse = warehouse;

	}

	public void run() {
		Random random = new Random();
		int num = 0;
		for (;;) {
			try {
				Thread.sleep(300); // 销售速度
				num = 1 + random.nextInt(10);
				warehouse.get(num);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}




Warehouse.java
package com.java.lang.thread.produce_consume;

public class Warehouse {
	public int pnum = 0;

	public Warehouse() {
		this.pnum = 0;
	}

	public Warehouse(int num) {
		this.pnum = num;
	}

	public synchronized void put(int value) throws InterruptedException {
		pnum += value;
		System.out.println("生产了" + value + "件产品.当前库存:" + pnum);
		if(pnum >= 20){
			this.notify();
		}
	}
	
	public synchronized void get(int value) throws InterruptedException {
		if (pnum == 0) {
			System.out.println("没有货了,停止销售。");
			this.wait();
		}else{
			if(value > pnum){
				value = pnum;
			}
			pnum -= value;
			System.out.println("销售了"+value+"件产品.当前库存:" + pnum);
		}
		
	}
}



Main.java
package com.java.lang.thread.produce_consume;

/**
 * wait/notify  机制是为了避免轮询带来的性能损失。
 * @author yuahan
 */
public class Main {
	public static void main(String[] args) {
		Warehouse warehouse= new Warehouse(10);  
		
        Producer p=new Producer(warehouse);  
        p.setName("生产");  
        
        Consumer consumer=new Consumer(warehouse);  
        consumer.setName("销售");  
        
        p.start();  
        consumer.start();  
		
	}
}

分享到:
评论

相关推荐

    Thread Test result output

    根据给定的文件信息,我们可以深入探讨Java中的多线程同步机制,特别是关于`wait()`、`notify()`和`synchronized`关键字的使用及其在实际应用中的表现。此测试结果输出揭示了多线程环境中线程的启动、等待、唤醒以及...

    第-章-JAVA多线程优秀文档.pptx

    JAVA 多线程是 Java 语言中的一种机制,允许程序同时执行多个任务,以提高程序的效率和响应速度。本文档将详细介绍 JAVA 多线程的概念、特点、创建方式、线程生命周期、同步机制、线程通信等知识点,并通过实例分析...

    java技术储备,如何提升自己

    2. wait() 和 notify():了解 wait() 和 notify() 的区别和用法。 3. volatile:深入理解 volatile 关键字的作用和实现机制。 4. CAS:了解 CAS(Compare And Swap)的实现机制和应用场景。 5. JUC 工具类:了解 JUC...

    积分管理系统java源码-AndroidKnowledgeSystem:Android知识架构体系

    wait和notify 线程池 锁 源码分析concurrent包 ConcurrentHashMap CopyOnWriteArrayList BlockingQeque ThreadLocal 反射 Kotlin Kotlin的优势 协程 Android热门技术 代码插桩技术 动态代理 插件化 热修复 日志系统 ...

    java面试题库(非常全面).

    6. **多线程**:线程的创建方式(Thread类和Runnable接口),同步机制(synchronized关键字、wait/notify、Lock接口等),并发容器(如ConcurrentHashMap)的使用。 7. **IO流**:了解字节流和字符流的区别,缓冲流...

    java 多线程的几种实现方法总结

    在 Java 中,同步的实现方法有两种:使用 synchronized 关键字和使用 wait、notify、notifyAll 方法。使用 synchronized 关键字可以使得某个方法或代码块在多线程中同步执行,而使用 wait、notify、notifyAll 方法...

    Java大数据面试常见问题.docx

    Hashtable 的区别、final、finally、finalize 的区别、switch 语句的使用、多线程的实现方法、Java 中的流类型、main 方法的访问权限、私有方法和传值、equals 方法的重写、Java 的平台独立性等。 1. String 和 ...

    超级有影响力霸气的Java面试题大全文档

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...

    Java线程/内存模型的缺陷和增强

    为了实现同步,Java提供了synchronize关键字以及object的wait()/notify()机制,可是在简单易用的背后,应藏着更为复杂的玄机,很多问题就是由此而起。 一、Java内存模型 在了解Java的同步秘密之前,先来看看JMM...

    synchronized用法大全实例

    `synchronized`还提供了基于`wait()`、`notify()`和`notifyAll()`的方法,用于线程间的通信。这些方法必须在同步块或同步方法中使用,否则会抛出`IllegalMonitorStateException`。等待/通知机制可以让一个线程在特定...

    xiancheng.rar_4EM_线程

    此外,wait()、notify()和notifyAll()方法也是线程同步的关键,它们用于线程间的通信,控制线程的执行顺序。 线程还有优先级的概念,Java提供了10个级别的线程优先级,从MIN_PRIORITY(1)到MAX_PRIORITY(10)。...

    Java Thin-Client Programming

    - **工作原理:**解释了条件变量如何通过wait()和notify()/notifyAll()方法来实现线程间的等待和唤醒。 - **读写互斥锁(Read-Write Mutexes)** - **定义:**读写互斥锁允许多个读取线程同时访问共享资源,但只...

    Effective Java 3rd edition(Effective Java第三版英文原版)附第二版

    Item 81: Prefer concurrency utilities to wait and notify Item 82: Document thread safety Item 83: Use lazy initialization judiciously Item 84: Don’t depend on the thread scheduler 12 Serialization ...

    Android代码-progress前台运算.zip

    在多线程环境中,需要确保数据的一致性和安全,可以使用 synchronize 关键字、wait() 和 notify() 方法,或者使用 Java并发工具类如 CountDownLatch 和 CyclicBarrier 进行线程间的同步与通信。 综上所述,Android...

    进销存系统文档作业例子

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 14、...

Global site tag (gtag.js) - Google Analytics