`
斌强-朱
  • 浏览: 51377 次
社区版块
存档分类
最新评论

线程生产者与消费者

 
阅读更多

线程出现重复取和重复赋值的情况

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实现的生产者消费者模型。

    多线程解决生产者与消费者问题

    本文通过多线程方法解决了生产者与消费者之间同步的问题

    java多线程生产者与消费者案例

    关于java多线程的东西,里面有生产者与消费者的案例,感兴趣的朋友看一下吧。

    java多线程实现生产者和消费者

    9. **测试与调试**:多线程问题往往难以复现,因此在编写生产者-消费者代码时,应编写充分的测试用例,包括边界情况,如缓冲区满和空的状态转换。 通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者...

    多线程_生产者与消费者模式示例

    在描述中提到的链接(),博主分享了一个关于多线程生产者与消费者模式的具体实现案例。虽然具体代码没有给出,但我们可以根据常见的实现方式来解析这个模式。 1. **共享数据结构**:在这个模式中,通常会有一个...

    java线程生产者与消费者从基础到入门.docx

    而生产者与消费者模型是多线程编程中一个经典的同步问题,主要用于解决资源的共享和高效利用。在这个模型中,生产者负责创建资源,而消费者则负责消费这些资源。为了保证生产与消费的协调进行,通常会用到线程同步...

    Java多线程实现生产者消费者

    本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...

    生产者和消费者模式多线程

    创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue&lt;String&gt; queue; public Producer(BlockingQueue&lt;String&gt; queue) { this....

    多线程简易实现生产者消费者模式

    生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...

    JAVA实现线程间同步与互斥生产者消费者问题

    本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...

    12.2 Qt5多线程:使用信号量实现生产者和消费者

    生产者-消费者问题是并发编程中的一个经典模型,它描述了两个或多个线程之间的协作,其中一个或多个线程(生产者)负责生成数据,而其他线程(消费者)则负责处理这些数据。在实际应用中,这可以对应于例如数据生成...

    利用单线程完成的生产者与消费者程序

    然而,给定的标题“利用单线程完成的生产者与消费者程序”表明,这个程序是在单线程环境中实现的,这意味着没有并发线程,而是通过某种机制模拟了生产者和消费者的行为。 生产者-消费者模型通常用于处理数据流,...

    c#多线程之生产者消费者

    "生产者消费者"模式是多线程应用中一个经典的范例,它通过线程间的协作来实现数据处理的高效与同步。这个模式的核心思想是将任务分为两个角色:生产者(Producer)和消费者(Consumer)。生产者负责生成数据,而消费...

    java多线程(生产者与消费者)

    生产者消费者模式是一种设计模式,它描述了两个不同类型的线程如何协作完成工作:生产者负责生成数据,而消费者负责消耗这些数据。为了使这个模式在多线程环境下安全运行,我们需要使用Java中的同步机制。 1. **...

    线程实现生产者消费者问题

    生产者消费者问题是多线程编程中的一个经典模型,用于演示如何在并发环境中通过共享资源进行协作。在这个模型中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。问题的关键在于如何保证生产者不会在无处...

    线程问题生产者消费者流程图

    生产者消费者流程图; 生产者消费者流程图。

    LINUX线程生产者消费者

    关于LINUX线程生产者和消费者例子,有很好的解释和帮助

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题

    生产者与消费者多线程案例

    在多线程编程中,生产者与消费者问题是一个经典的问题,它涉及到线程间的同步和通信。此案例中,我们看到一个使用互斥锁(mutexes)和条件变量(conditions)来解决该问题的实现。代码由Zou Jian Guo于2003年12月22...

Global site tag (gtag.js) - Google Analytics