有一个生产者消费者实例,修改了一下,觉得还行,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();
}
}
分享到:
相关推荐
根据给定的文件信息,我们可以深入探讨Java中的多线程同步机制,特别是关于`wait()`、`notify()`和`synchronized`关键字的使用及其在实际应用中的表现。此测试结果输出揭示了多线程环境中线程的启动、等待、唤醒以及...
JAVA 多线程是 Java 语言中的一种机制,允许程序同时执行多个任务,以提高程序的效率和响应速度。本文档将详细介绍 JAVA 多线程的概念、特点、创建方式、线程生命周期、同步机制、线程通信等知识点,并通过实例分析...
2. wait() 和 notify():了解 wait() 和 notify() 的区别和用法。 3. volatile:深入理解 volatile 关键字的作用和实现机制。 4. CAS:了解 CAS(Compare And Swap)的实现机制和应用场景。 5. JUC 工具类:了解 JUC...
wait和notify 线程池 锁 源码分析concurrent包 ConcurrentHashMap CopyOnWriteArrayList BlockingQeque ThreadLocal 反射 Kotlin Kotlin的优势 协程 Android热门技术 代码插桩技术 动态代理 插件化 热修复 日志系统 ...
6. **多线程**:线程的创建方式(Thread类和Runnable接口),同步机制(synchronized关键字、wait/notify、Lock接口等),并发容器(如ConcurrentHashMap)的使用。 7. **IO流**:了解字节流和字符流的区别,缓冲流...
在 Java 中,同步的实现方法有两种:使用 synchronized 关键字和使用 wait、notify、notifyAll 方法。使用 synchronized 关键字可以使得某个方法或代码块在多线程中同步执行,而使用 wait、notify、notifyAll 方法...
Hashtable 的区别、final、finally、finalize 的区别、switch 语句的使用、多线程的实现方法、Java 中的流类型、main 方法的访问权限、私有方法和传值、equals 方法的重写、Java 的平台独立性等。 1. String 和 ...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...
为了实现同步,Java提供了synchronize关键字以及object的wait()/notify()机制,可是在简单易用的背后,应藏着更为复杂的玄机,很多问题就是由此而起。 一、Java内存模型 在了解Java的同步秘密之前,先来看看JMM...
`synchronized`还提供了基于`wait()`、`notify()`和`notifyAll()`的方法,用于线程间的通信。这些方法必须在同步块或同步方法中使用,否则会抛出`IllegalMonitorStateException`。等待/通知机制可以让一个线程在特定...
此外,wait()、notify()和notifyAll()方法也是线程同步的关键,它们用于线程间的通信,控制线程的执行顺序。 线程还有优先级的概念,Java提供了10个级别的线程优先级,从MIN_PRIORITY(1)到MAX_PRIORITY(10)。...
- **工作原理:**解释了条件变量如何通过wait()和notify()/notifyAll()方法来实现线程间的等待和唤醒。 - **读写互斥锁(Read-Write Mutexes)** - **定义:**读写互斥锁允许多个读取线程同时访问共享资源,但只...
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 ...
在多线程环境中,需要确保数据的一致性和安全,可以使用 synchronize 关键字、wait() 和 notify() 方法,或者使用 Java并发工具类如 CountDownLatch 和 CyclicBarrier 进行线程间的同步与通信。 综上所述,Android...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 14、...