`
wh137795233
  • 浏览: 6961 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

java 多线程的生产者-消费者 实现

阅读更多

      Java 语言实现生产者 --  消费者模式,本文采用1个生产者和3个消费者,以体现多线程并发过程中应该注意的地方。

      其中,容器采用java.util.concurrent.LinkedBlockingQueue,这是一个并发容器,包concurrent就是Java专门为实现并发而提供的一组工具包。

 

      思路:一个容量为100的容器,一个生产者(一个线程)不断向其中添加从0开始的整数,如果超出容器范围则线程阻塞1s,与此同时,三个消费者(三个线程,当然也可以是更多~)不断向容器拿出整数,如果容器取空,则线程阻塞1s。

 

      对容器操作是主要的部分,此处要考虑线程的并发性,而此时因为LinkedBlockingQueue是线程安全的,因此就可以不用加锁和Syncholized关键字等。多方便啊~

 

public class BlockingQueueTest
{
	private BlockingQueue<Integer> bq;
	private int M=100;
	public BlockingQueueTest()
	{
		bq = new LinkedBlockingQueue<>(M);
	}
	public boolean putIn(int n)
	{
		if(bq.size()<M)
		{
			bq.add(n);
			return true;
		}else{
			return false;
		}
	}
	public int getOut()
	{
		if(bq.size()>0)
		{
			return bq.poll();
			
		}else{
			return -1;
		}
	}
}

          容器实现了,就实现生产者和消费者这两个线程吧,线程的实现主要有两种:一种是继承父类Thread,第二种是实现接口Runnable();此处实现接口—>减少类之间的耦合度。

 

public void run()
	{
		while (true)
		{
			for (int i=0; i<100000;i++)
			{
				if (bqt.putIn(i))
				{
				 dataOut(Thread.currentThread().getName()+"     put:"+i);
				} else
				{
					 dataOut("Queue is full ! Sleep for 1s");
					try
					{
						Thread.sleep(1000);
					} catch (InterruptedException e)
					{
						e.printStackTrace();
					}
				}
			}
		}
	}

          消费者则更加简单:

public void run()
	{
		while (true)
		{
			int i = bqt.getOut();
			if(i!=-1)
			{
				dataOut(Thread.currentThread().getName() + " get  " + i);
			}else{
				dataOut(Thread.currentThread().getName() +": Queue is empty! Sleep for 1s");
				try
				{
					Thread.sleep(1000);
				} catch (InterruptedException e)
				{
					e.printStackTrace();
				}
			}
		}
		
	}

       其中输出的方法实现:(此处可根据具体情况改变)

public void dataOut(String s)
	{
		System.out.println(s);
	}

 

       主要的几个都实现了,生成测试类:

public static void main(String[] args) throws Exception
	{
		BlockingQueueTest bqt = new BlockingQueueTest();
		Thread f = new Thread(new Productor(bqt));
		Thread a = new Thread(new Consumer(bqt));
		Thread a1 = new Thread(new Consumer(bqt));
		Thread a2 = new Thread(new Consumer(bqt));
		f.setName("Productor");
		a.setName("consumer 1");
		a1.setName("consumer 2");
		a2.setName("consumer 3");
		f.start();
		a.start();
		a1.start();
		a2.start();
	}

  

        最后贴个结果图把:



 

源码在这里~~

 

  • 大小: 6.7 KB
1
0
分享到:
评论

相关推荐

    Java多线程 生产者-消费者模式

    生产者-消费者模式是一种经典的多线程设计模式,用于解决数据共享问题,尤其是在一个线程生产数据而另一个线程消费数据的情况下。在这个模式中,生产者负责生成数据并放入共享的数据结构(如队列),而消费者则从这...

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

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

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

    在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...

    java实现多线程经典模型生产者消费

    java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...

    生产者-消费者多线程处理

    总之,"生产者-消费者"多线程处理是一个核心的并发编程概念,它展示了如何在多线程环境中有效地管理和共享资源,以实现高效的程序执行。理解并正确实现这一模式对于任何从事并发编程或系统设计的IT专业人员来说都至...

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

    用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题

    java多线程经典模型生产者消费者

    java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...

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

    总之,生产者消费者模式是多线程编程中的一种重要设计模式,它通过信号量和条件变量实现了线程间的同步和通信,有效提高了系统资源的利用率和整体效率。在Java中,我们可以借助并发库轻松实现这一模式,使得代码更加...

    java多线程实现生产者消费者关系

    在实际应用中,我们常常会遇到一种典型的多线程问题——生产者消费者模型。这个模型描述了两种类型的线程:生产者线程负责创建或生产资源,而消费者线程则负责消耗这些资源。在Java中,我们可以利用同步机制来实现...

    【IT十八掌徐培成】Java基础第08天-04.多线程-生产者-消费者.zip

    通过学习和实践"生产者-消费者"模型,开发者能够更好地理解和掌握Java多线程的精髓,为构建高并发、高效率的应用打下坚实的基础。在实际项目中,这种模型常被用于实现缓存管理、消息队列以及数据库连接池等场景。

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

    4. **阻塞队列(BlockingQueue)**:Java并发包(java.util.concurrent)中的阻塞队列是实现生产者消费者模式的理想选择。它们在内部已经处理了线程同步和等待,提供了一种高效且安全的共享数据方式。例如,`put()`...

    操作系统:多线程处理生产者消费者,java实现

    基本满足操作系统课上要求,java实现的生产者消费者模型。

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

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

    Java线程间的通信----生产者消费者模型

    3. **生产者消费者模型的实现步骤**: - 创建一个阻塞队列作为共享数据结构。 - 生产者线程负责向队列中添加元素,当队列满时,调用`put()`方法会阻塞生产者。 - 消费者线程负责从队列中移除元素,当队列空时,...

    基于JAVA线程机制研究生产者-消费者问题.pdf

    在Java中实现生产者-消费者问题不仅能够加深对Java多线程编程的理解,还能够锻炼出良好的并发编程思维,这对于未来在软件工程和系统开发等领域的工作至关重要。 总之,基于Java线程机制研究生产者-消费者问题,通过...

    【IT十八掌徐培成】Java基础第08天-05.多线程-生产者-消费者2.zip

    "生产者-消费者"模式是多线程编程中的一个经典设计模式,它体现了线程间的协作和同步。在这个模式中,"生产者"线程负责创建资源,而"消费者"线程则负责消耗这些资源。这个模式在实际应用中非常常见,例如在消息队列...

    用多线程同步方法解决生产者-消费者问题

    总的来说,解决生产者-消费者问题需要深入理解线程同步原理,并结合具体的需求进行设计和实现。这个过程不仅锻炼了编程能力,也对并发编程的理解有着重要的实践意义。在实际项目中,这样的并发控制技术广泛应用在...

    多线程间通信:多生产者-多消费者实例

    `BlockingQueue`是一种线程安全的数据结构,它实现了生产者和消费者之间的阻塞等待。当队列满时,生产者会阻塞直到有空间可以插入;同样,当队列为空时,消费者也会阻塞等待新的数据。 下面是一个简单的多生产者-多...

Global site tag (gtag.js) - Google Analytics