java并发控制四种方法:
1.wait()/notify();
2.
await() / signal()
;
3.BlockingQueue
阻塞队列方法;
4.PipedInputStream / PipedOutputStream
最常用的是wait()/notify(),简单demo见代码:
仓库类:
import java.util.LinkedList;
public class Storage {
public static final int MAX_SIZE = 100;
private LinkedList<Object> list = new LinkedList<Object>();
public void produce(int num) {
synchronized (list) {
while (num + list.size() > Storage.MAX_SIZE) {
System.out.println("要生产的产品数量:" + num + "库存量"
+ list.size() + "暂不能执行生产任务");
try {
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i = 0; i < num; i++) {
list.add(new Object());
}
System.out.println("已经生产产品数:" + num + "现库存量为:" + list.size());
list.notifyAll();
}
}
public void consume(int num) {
synchronized (list) {
while (num > list.size()) {
System.out.println("要消费的产品数量:" + num + "库存量:"
+ list.size() + "暂时不能执行消费任务!");
try {
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i = 1; i <= num; ++i) {
list.remove();
}
System.out.println("已经消费产品数:" + num + "现库存量为:" + list.size());
list.notifyAll();
}
}
public LinkedList<Object> getList() {
return list;
}
public void setList(LinkedList<Object> list) {
this.list = list;
}
}
生产者类:
public class Producer implements Runnable {
private int num;
private Storage storage;
public Producer(Storage storage){
this.storage = storage;
}
@Override
public void run() {
this.produce();
}
public void produce(){
this.storage.produce(this.num);
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public Storage getStorage() {
return storage;
}
public void setStorage(Storage storage) {
this.storage = storage;
}
}
消费者类:
public class Consumer implements Runnable {
private int num;
private Storage storage;
public Consumer(Storage storage){
this.storage = storage;
}
@Override
public void run() {
this.consume();
}
private void consume(){
this.storage.consume(this.num);
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public Storage getStorage() {
return storage;
}
public void setStorage(Storage storage) {
this.storage = storage;
}
}
测试方法类:
public class SysTest {
public static void main(String[] args) {
Storage storage = new Storage();
Producer pt1 = new Producer(storage);
pt1.setNum(10);
Producer pt2 = new Producer(storage);
pt2.setNum(10);
Producer pt3 = new Producer(storage);
pt3.setNum(10);
Producer pt4 = new Producer(storage);
pt4.setNum(10);
Producer pt5 = new Producer(storage);
pt5.setNum(10);
Producer pt6 = new Producer(storage);
pt6.setNum(10);
Producer pt7 = new Producer(storage);
pt7.setNum(80);
Thread p1 = new Thread(pt1);
Thread p2 = new Thread(pt2);
Thread p3 = new Thread(pt3);
Thread p4 = new Thread(pt4);
Thread p5 = new Thread(pt5);
Thread p6 = new Thread(pt6);
Thread p7 = new Thread(pt7);
Consumer ct1 = new Consumer(storage);
ct1.setNum(50);
Consumer ct2 = new Consumer(storage);
ct2.setNum(20);
Consumer ct3 = new Consumer(storage);
ct3.setNum(30);
Thread c1 = new Thread(ct1);
Thread c2 = new Thread(ct2);
Thread c3 = new Thread(ct3);
c1.start();
c2.start();
c3.start();
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
p6.start();
p7.start();
}
}
结果:
要消费的产品数量:50库存量:0暂时不能执行消费任务!
要消费的产品数量:30库存量:0暂时不能执行消费任务!
已经生产产品数:10现库存量为:10
要消费的产品数量:30库存量:10暂时不能执行消费任务!
要消费的产品数量:20库存量:10暂时不能执行消费任务!
要消费的产品数量:50库存量:10暂时不能执行消费任务!
已经生产产品数:10现库存量为:20
已经生产产品数:10现库存量为:30
已经生产产品数:10现库存量为:40
要消费的产品数量:50库存量:40暂时不能执行消费任务!
已经消费产品数:20现库存量为:20
要消费的产品数量:30库存量:20暂时不能执行消费任务!
已经生产产品数:10现库存量为:30
要消费的产品数量:50库存量:30暂时不能执行消费任务!
要生产的产品数量:80库存量30暂不能执行生产任务
已经消费产品数:30现库存量为:0
已经生产产品数:10现库存量为:10
已经生产产品数:80现库存量为:90
已经消费产品数:50现库存量为:40
分享到:
相关推荐
生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...
### 由生产者/消费者问题深入理解JAVA多线程 #### 生产者/消费者问题概述 生产者/消费者问题是一个经典的计算机科学问题,用于展示进程间的通信与同步问题。在这个模型中,生产者负责创建数据并将其放置到共享内存...
"生产者-消费者"模式是多线程编程中的一个经典设计模式,它体现了线程间的协作和同步。在这个模式中,"生产者"线程负责创建资源,而"消费者"线程则负责消耗这些资源。这个模式在实际应用中非常常见,例如在消息队列...
本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...
在Java编程中,"线程同步--生产者消费者问题"是一个经典的多线程问题,它涉及到如何有效地在多个线程之间共享资源。这个问题通常用于演示和理解线程间的协作机制,如互斥锁、条件变量等。在此,我们将深入探讨这个...
生产者-消费者模式广泛应用于并发编程,例如数据库连接池、缓存管理、消息队列等场景。通过合理地运用这一模式,我们可以有效地管理和协调系统资源,提高系统的并发性能和响应速度。 在实际开发中,我们还可以使用`...
### Java多线程-生产者与消费者问题 #### 一、生产者与消费者问题概览 **1.1 概要** 生产者与消费者问题是计算机科学中一个多线程同步的经典问题。它描述了两个线程如何共享有限资源的场景:一个是生产者...
《实战Java高并发程序设计》是一本专注于Java并发编程的经典文献,它深入浅出地讲解了如何在Java环境中处理高并发场景。这本书是PDF格式,包含详细的目录,方便读者快速定位到所需的知识点,是Java开发者提升并发...
"生产者-消费者"模型是多线程问题中的经典案例,它揭示了如何通过线程间的协作来实现数据共享和高效利用资源。今天我们将深入探讨这个主题。 生产者-消费者模型是由两个主要角色构成:生产者和消费者。生产者负责...
- **阻塞队列**:如`ArrayBlockingQueue`、`LinkedBlockingQueue`和`PriorityBlockingQueue`,它们在生产者-消费者模型中的应用。 3. **原子操作与CAS** - **java.util.concurrent.atomic**包:原子变量类如`...
在Java编程中,"生产者-消费者"模式是一种经典的多线程问题,它涉及到了并发处理和资源管理。这个模式的主要目标是通过分离生产数据和消费数据的过程,提高系统的效率和灵活性。在这个模式中,"生产者"负责生成数据...
在实际应用中,生产者/消费者模式广泛用于处理并发任务调度、数据缓冲、异步处理等场景。例如,在消息中间件中,生产者负责发布消息,消费者负责接收并处理消息,两者通过阻塞队列进行通信,提高了系统的并行性和...
在Java编程中,"生产者与消费者"模式是一种经典的多线程问题,它涉及到了并发处理和资源管理。这个模式的核心思想是通过共享一个有限的缓冲区,使得生产者线程可以将产品放入缓冲区,而消费者线程则可以从缓冲区取出...
生产者/消费者模型是多线程编程中的一个经典设计模式,它有效地利用了资源,避免了数据竞争和阻塞问题。这个模型的核心思想是将生产者和消费者分隔开,使得生产者可以专注于创建产品,而消费者则专注于消耗这些产品...
- **生产者-消费者模式**:实现生产者-消费者模式下的高效数据交换机制。 - **读写锁**:了解读写锁的实现原理及应用场景。 - **屏障模式**:探讨屏障模式在并行计算中的应用及其实现细节。 - **工作偷窃模式**:...
【JAVA课程设计(生产者-消费者问题)】是学习多线程编程的一个经典案例,它主要探讨了如何在并发环境中有效地管理和协调生产者线程和消费者线程的交互。在这个设计中,生产者负责生成产品并放入共享资源区,而消费...
BlockingQueue是一种阻塞队列,常用于生产者消费者模型,通过它可以实现线程间的协作。 死锁、活锁和饥饿是并发编程中常见的问题。死锁是指两个或多个线程相互等待对方释放资源而形成僵局;活锁是线程不断尝试但...
生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`notify()`和`notifyAll()`这三个方法,以及`synchronized`关键字来解决这个...
- **生产者消费者模型**:了解BlockingQueue如何实现生产者消费者问题,以及使用Condition进行高级控制。 - **读写锁**:ReentrantReadWriteLock 提供了读写分离的锁,允许多个读操作并行,提高并发性能。 8. **...
- **阻塞队列**:如`ArrayBlockingQueue`、`LinkedBlockingQueue`,在生产者消费者模型中的应用。 4. **并发工具类** - **CountDownLatch**:用于多线程间的协调,等待所有任务完成。 - **CyclicBarrier**:允许...