package org.hkw.multithread;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadDCTest {
public static void main(String[] args) {
Thread p = new Thread(new Producer("p1"));
Thread p2 = new Thread(new Producer("p2"));
Thread c = new Thread(new Consumer("c1"));
Thread c2 = new Thread(new Consumer("c2"));
p.start();
p2.start();
c.start();
c2.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Storehouse.getInstance().close();
c.interrupt();
c2.interrupt();
p.interrupt();
p2.interrupt();
}
}
class Storehouse {
static final int STATUS_EMPETY = 0;
static final int STATUS_FULL = 1;
boolean isClosed = false;
String item;
int status;
Lock lock = new ReentrantLock();
private static Storehouse house = new Storehouse();
private Storehouse() {
}
public static Storehouse getInstance() {
return house;
}
public String getItem() {
status = STATUS_EMPETY;
return item;
}
public void setItem(String item) {
status = STATUS_FULL;
this.item = item;
}
public int getStatus() {
return status;
}
public boolean isEmpty() {
return status == STATUS_EMPETY;
}
public boolean isClosed() {
return isClosed;
}
public void close() {
isClosed = true;
}
public void produce(String name) throws InterruptedException {
lock.lockInterruptibly();
try {
if (isEmpty()) {
String item = name + " fill";
System.out.println(name + " produce item:" + item);
setItem(item);
}
} finally {
lock.unlock();
}
}
public void consum(String name) throws InterruptedException {
lock.lockInterruptibly();
try {
if (!isEmpty()) {
System.out.println(name + " consum item:" + house.getItem());
}
} finally {
lock.unlock();
}
}
}
class Producer implements Runnable {
Storehouse house = Storehouse.getInstance();
String name;
public Producer(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(name + " producer start");
while (!Thread.currentThread().isInterrupted() && !house.isClosed()) {
try {
house.produce(name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println(name + " producer interrupted");
Thread.currentThread().interrupt();
}
}
System.out.println(name + " producer end");
}
}
class Consumer implements Runnable {
Storehouse house = Storehouse.getInstance();
String name;
public Consumer(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(name + " cosumer start");
while (!Thread.currentThread().isInterrupted() && !house.isClosed()) {
try {
house.consum(name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println(name + " cosumer interrupted");
Thread.currentThread().interrupt();
}
}
System.out.println(name + " consumer end");
}
}
分享到:
相关推荐
在你分享的代码中,可能采用了中介者设计模式来协调生产者和消费者之间的交互,进一步降低了耦合度。 生产者消费者模式通常包括三个主要元素: 1. **生产者(Producer)**:负责生成数据并放入缓冲区。生产者不关心...
生产者消费者模式是一种经典的多线程同步问题,用于在并发环境中协调生产者和消费者之间的数据处理。在这个模式中,生产者负责生成数据,而消费者则负责处理这些数据。Java提供了丰富的并发工具,如`BlockingQueue`...
在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...
在IT领域,多线程是并发编程中的一...通过理解和熟练掌握生产者消费者模式,开发者能够更好地解决并发环境下的数据处理问题,提高系统的并行性和效率。同时,结合线程池的使用,可以进一步优化资源管理,提升系统性能。
在Java编程中,"生产者消费者"模式是一种经典的多线程设计模式,它主要用于解决并发问题,特别是数据处理和资源管理。在这个模式中,生产者负责生成数据,而消费者则负责消耗这些数据。这种模式利用了Java的并发API...
在这个实验中,通过Java的并发库(如`ReentrantLock`或`Semaphore`)实现信号量机制,确保生产者不会在缓冲区满时生产产品,消费者也不会在缓冲区空时尝试消费。实验的实施有助于深入理解操作系统中并发控制和资源...
在生产者消费者问题中,适配器模式可能被用来协调生产者和消费者之间的通信,确保数据的正确生产和消费。 在Java中,有几种常见的解决生产者消费者问题的方法: 1. **阻塞队列(BlockingQueue)**:Java并发包`...
"生产者-消费者"模式是一种经典的并发设计模式,广泛应用于解决数据处理中的异步问题。本项目提供了一个简单的Java实现,帮助开发者理解如何在实际场景中运用这种模式。 生产者-消费者模式的核心思想是共享资源...
在Java编程语言中,生产者消费者模式是一种经典的多线程设计模式,用于处理并发问题。在JDK 1.5及以后的版本中,Java引入了`java.util.concurrent`包,其中包含了一些强大的并发工具类,如`Lock`接口和`Condition`...
在计算机科学中,生产者-消费者问题是多线程并发控制中的一个经典问题。该问题描述了两个并发执行的进程——生产者和消费者,它们共享一个有限大小的缓冲区。生产者进程负责生成数据(消息)并放入缓冲区,而消费者...
总的来说,"操作系统生产者与消费者问题Java简单模拟实现"这个项目提供了一个直观的多线程编程实例,帮助我们理解和实践Java中的线程同步技术,这对于理解和解决实际并发问题具有重要意义。通过分析这个项目,我们...
Java的并发集合框架提供了`BlockingQueue`接口,它内置了线程安全性和阻塞行为,非常适合实现生产者-消费者模式。`BlockingQueue`有多个实现类,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等,它们自动处理阻塞...
生产者消费者问题是多线程编程中的经典模型,用于展示如何在并发环境中协调生产者和消费者之间的数据处理。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。Java语言提供了丰富的工具来解决...
生产者消费者问题是多线程编程中的经典案例,用于演示如何通过同步机制来协调不同线程间的协作。这个问题的核心在于一个共享资源池,生产者线程负责填充资源,而消费者线程负责消耗这些资源,两者之间需要协调以避免...
而“工具”可能指的是使用某些编程工具或者库来辅助实现生产者-消费者模式,例如Java的并发库。 在压缩包文件名称列表中,"howsky"可能是该博客作者的名称或者是与生产者-消费者问题相关的代码文件或示例的名称。...
生产者和消费者问题以及哲学家就餐问题是在多线程编程中常常被用来讨论并发控制的经典示例。这两个问题都涉及到资源的共享与访问同步,它们是理解并发编程中线程安全性和互斥机制的重要概念。 生产者消费者问题是多...
在IT领域,生产者与消费者问题是一个经典的多线程同步问题,主要涉及到计算机科学中的并发编程。本课程设计旨在通过Java语言来实现这一概念,帮助学生深入理解线程间的协作和资源管理。以下是对该主题的详细阐述: ...
操作系统课程设计中的“生产者-消费者问题”是一个经典的并发编程模型,主要用来演示如何在多线程环境下协调生产者和消费者的行为,以达到资源的有效利用和避免数据竞争。在这个Java实现的小程序中,我们将深入探讨...
除了`BlockingQueue`,Java还提供了其他同步工具,如`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法,以及`ReentrantLock`、`Condition`等,它们都可以用来解决生产者消费者问题,但`BlockingQueue...
生产者与消费者问题是一个经典的多线程同步问题,在计算机科学特别是并发编程领域有着重要的地位。这个问题的核心在于如何在多个线程之间有效地共享资源,确保生产者(生成数据的线程)能够将数据安全地放入缓冲区,...