线程出现重复取和重复赋值的情况
class Info{
private String name;
private String content;
public void setName(String name){
this.name = name ;
}
public void setContent(String content){
this.content = content ;
}
public String getName(){
return this.name ;
}
public String getContent(){
return this.content ;
}
public synchronized void set(String name, String content){
this.setName(name);
try{
Thread.sleep(300);
}catch(Exception e){
e.printStackTrace();
}
this.setContent(content);
}
public synchronized void get(){
try{
Thread.sleep(300);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(this.getName() + "<--->" + this.getContent());
}
}
class Producer implements Runnable{
private Info info;
public Producer(Info info){
this.info = info;
}
@Override
public void run(){
boolean flag = false;
for (int i=0;i<50 ;i++ ){
if(flag){
this.info.set("123", "789");
flag = false;
}else{
this.info.set("abc", "xyz");
flag = true;
}
}
}
}
class Consumer implements Runnable{
private Info info;
public Consumer(Info info){
this.info = info;
}
@Override
public void run(){
for(int i=0;i<50 ;i++ ){
this.info.get();
}
}
}
public class T3 {
public static void main(String[] args) {
Info info = new Info();
Producer pro = new Producer(info);
Consumer con = new Consumer(info);
new Thread(pro).start();
new Thread(con).start();
}
}
利用Object类的wait()和notify()方法
class Info{
private String name = "123";
private String content = "789";
private boolean flag = false;
public void setName(String name){
this.name = name ;
}
public void setContent(String content){
this.content = content ;
}
public String getName(){
return this.name ;
}
public String getContent(){
return this.content ;
}
public synchronized void set(String name, String content){
if(!flag){
try{
super.wait();
}catch(Exception e){
e.printStackTrace();
}
}
this.setName(name);
try{
Thread.sleep(300);
}catch(Exception e){
e.printStackTrace();
}
this.setContent(content);
flag = !flag;
super.notify();
}
public synchronized void get(){
if(flag){
try{
super.wait();
}catch(Exception e){
e.printStackTrace();
}
}
try{
Thread.sleep(300);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(this.getName() + "<--->" + this.getContent());
flag = !flag;
super.notify();
}
}
class Producer implements Runnable{
private Info info;
public Producer(Info info){
this.info = info;
}
@Override
public void run(){
boolean flag = false;
for (int i=0;i<50 ;i++ ){
if(flag){
this.info.set("123", "789");
flag = false;
}else{
this.info.set("abc", "xyz");
flag = true;
}
}
}
}
class Consumer implements Runnable{
private Info info;
public Consumer(Info info){
this.info = info;
}
@Override
public void run(){
for(int i=0;i<50 ;i++ ){
this.info.get();
}
}
}
public class T4 {
public static void main(String[] args) {
Info info = new Info();
Producer pro = new Producer(info);
Consumer con = new Consumer(info);
new Thread(pro).start();
new Thread(con).start();
}
}
分享到:
相关推荐
多线程生产者与消费者,,生产者和消费者的解答网络上有多种线程版本,但却没看到进程版本,所以我就来填补这一“空白”了。PS:使用进程版本的另一个重要原因是,想顺便复习下共享内存。 我们使用信号量来同步,用...
基本满足操作系统课上要求,java实现的生产者消费者模型。
本文通过多线程方法解决了生产者与消费者之间同步的问题
关于java多线程的东西,里面有生产者与消费者的案例,感兴趣的朋友看一下吧。
9. **测试与调试**:多线程问题往往难以复现,因此在编写生产者-消费者代码时,应编写充分的测试用例,包括边界情况,如缓冲区满和空的状态转换。 通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者...
在描述中提到的链接(),博主分享了一个关于多线程生产者与消费者模式的具体实现案例。虽然具体代码没有给出,但我们可以根据常见的实现方式来解析这个模式。 1. **共享数据结构**:在这个模式中,通常会有一个...
而生产者与消费者模型是多线程编程中一个经典的同步问题,主要用于解决资源的共享和高效利用。在这个模型中,生产者负责创建资源,而消费者则负责消费这些资源。为了保证生产与消费的协调进行,通常会用到线程同步...
本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...
创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue<String> queue; public Producer(BlockingQueue<String> queue) { this....
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...
生产者-消费者问题是并发编程中的一个经典模型,它描述了两个或多个线程之间的协作,其中一个或多个线程(生产者)负责生成数据,而其他线程(消费者)则负责处理这些数据。在实际应用中,这可以对应于例如数据生成...
然而,给定的标题“利用单线程完成的生产者与消费者程序”表明,这个程序是在单线程环境中实现的,这意味着没有并发线程,而是通过某种机制模拟了生产者和消费者的行为。 生产者-消费者模型通常用于处理数据流,...
"生产者消费者"模式是多线程应用中一个经典的范例,它通过线程间的协作来实现数据处理的高效与同步。这个模式的核心思想是将任务分为两个角色:生产者(Producer)和消费者(Consumer)。生产者负责生成数据,而消费...
生产者消费者模式是一种设计模式,它描述了两个不同类型的线程如何协作完成工作:生产者负责生成数据,而消费者负责消耗这些数据。为了使这个模式在多线程环境下安全运行,我们需要使用Java中的同步机制。 1. **...
生产者消费者问题是多线程编程中的一个经典模型,用于演示如何在并发环境中通过共享资源进行协作。在这个模型中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。问题的关键在于如何保证生产者不会在无处...
生产者消费者流程图; 生产者消费者流程图。
关于LINUX线程生产者和消费者例子,有很好的解释和帮助
a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题
在多线程编程中,生产者与消费者问题是一个经典的问题,它涉及到线程间的同步和通信。此案例中,我们看到一个使用互斥锁(mutexes)和条件变量(conditions)来解决该问题的实现。代码由Zou Jian Guo于2003年12月22...