`

线程 多生产者多消费者和使用Lock类实现写法

 
阅读更多

 

 

 

 

分为三种方式实现,具体见代码注释:

 

package beijing.lele;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ProduceConsumeMoreThread {

	/**
	 * 使用 Lock  + Condition类 实现
	 * 在使用 第一种方式的notifyAll中,由于notifyAll唤醒的是己方和对方线程,优化的是只唤醒对方进程
	 * 
	 */
	
   
	public static void main(String[] args) {
		//Resources  rource =new Resources(); 使用 notifyAll方式 实现多生产多消费
		//ResourcesCondition rource =new ResourcesCondition();  使用 Lock  Condition方式
		ResourcesConditionMore rource =new ResourcesConditionMore(); // 使用改进版 Lock  Condition方式
		ProductorMore  pro = new ProductorMore(rource);
		ConsumerMore   con = new ConsumerMore(rource);
		Thread t1 =new Thread(pro,"张大厨");
	    Thread t2 =new Thread(pro,"李大厨");//多个生产者
	    Thread t3 =new Thread(con,"学生甲");
	    Thread t4 =new Thread(con,"学生乙");//多个消费者
	    t1.start();
	    t2.start();
	    t3.start();
	    t4.start();
	    System.out.println("Hello World!");
		
	}
	
	
}



class ConsumerMore  implements Runnable
{
    private Resources res;
    private ResourcesCondition res1;
    private ResourcesConditionMore res2;
    
    ConsumerMore(Resources res){
        this.res =res;
    }
    
    ConsumerMore(ResourcesCondition res1){
        this.res1 =res1;
    }
    
    ConsumerMore(ResourcesConditionMore res){
        this.res2 =res;
    }
    
    
    public void run(){
        while(true){
            //res.out();
        	//res1.out();
        	res2.out();
        }
    }

}



class ProductorMore implements Runnable
{
    private Resources res;
    private ResourcesCondition res1 ; 
    ResourcesConditionMore res2;
    
    ProductorMore(Resources res){
        this.res =res;
    }
    
    ProductorMore(ResourcesCondition res){
        this.res1 =res;
    }
    
    ProductorMore(ResourcesConditionMore res){
        this.res2 =res;
    }
    
    public void run(){
        while(true){
            //res.set("++商品++");
        	//res1.set("++商品++");
        	res2.set("++商品++");
        }
    }

}


/**
这是这一版的跑的结果,可以看到 即使在 消费时长
张大厨生产者++商品++--1
学生甲 ....消费者....++商品++--1
张大厨生产者++商品++--2
学生甲 ....消费者....++商品++--2
张大厨生产者++商品++--3
学生甲 ....消费者....++商品++--3
张大厨生产者++商品++--4
学生乙 ....消费者....++商品++--4
张大厨生产者++商品++--5
学生乙 ....消费者....++商品++--5
张大厨生产者++商品++--6
学生乙 ....消费者....++商品++--6
张大厨生产者++商品++--7
学生乙 ....消费者....++商品++--7
张大厨生产者++商品++--8
学生乙 ....消费者....++商品++--8
张大厨生产者++商品++--9
学生乙 ....消费者....++商品++--9
张大厨生产者++商品++--10
学生乙 ....消费者....++商品++--10
张大厨生产者++商品++--11
学生甲 ....消费者....++商品++--11
张大厨生产者++商品++--12
学生甲 ....消费者....++商品++--12
李大厨生产者++商品++--13
学生甲 ....消费者....++商品++--13
李大厨生产者++商品++--14
学生甲 ....消费者....++商品++--14
 * @author Administrator
 *
 */
class ResourcesCondition
{
    private String name;
    private int count =1;
    private boolean flag =false;
    private Lock lock = new ReentrantLock(); // 替代 synchronized的并提供更强大的功能 
    
    private Condition condition = lock.newCondition();
    
    public  void set(String name)
    {  
    	lock.lock();
    
      try {
       while(flag) {
		condition.await();
       }
       Thread.sleep(200);
       this.name = name+"--"+count++;
       System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
       flag = true;
       condition.signalAll(); // 唤醒
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}finally {
			lock.unlock();
		}
    
      

    }
    public synchronized void out()
    {
    	lock.lock();
    	try{
    		 //1)循环判断
    	       while(!flag){
    	    	   condition.await();
    	       }
    	       Thread.sleep(600);
    	       System.out.println(Thread.currentThread().getName()+" ....消费者...."+this.name);
    	       flag =false;
    	       condition.signalAll();
    	} catch (InterruptedException e) {
       		e.printStackTrace();
       	}// 模拟消费耗时
    	finally {
    		 lock.unlock();
    	}
    }
       
      
}




class ResourcesConditionMore
{
    private String name;
    private int count =1;
    private boolean flag =false;
    private Lock lock = new ReentrantLock(); 
    
    
    private Condition condition_pro = lock.newCondition();// 使用Lock建立生产者的condition对象
    private Condition condition_consume = lock.newCondition();// 使用Lock建立消费者的condition对象
    
    public  void set(String name)
    {  
    	lock.lock();
    
      try {
       while(flag) {
    	   condition_pro.await();
       }
       Thread.sleep(200);
       this.name = name+"--"+count++;
       System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
       flag = true;
       condition_consume.signal(); // 生产者生产完毕后,唤醒消费者的进程(不再是signalAll)
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}finally {
			lock.unlock();
		}
    

    }
    public synchronized void out()
    {
    	lock.lock();
    	try{
    		 //1)循环判断
    	       while(!flag){
    	    	   condition_consume.await();
    	       }
    	       Thread.sleep(600);
    	       System.out.println(Thread.currentThread().getName()+" ....消费者...."+this.name);
    	       flag =false;
    	       condition_pro.signal(); // 消费者消费完毕后,唤醒生产者的进程
    	} catch (InterruptedException e) {
       		e.printStackTrace();
       	}// 模拟消费耗时
    	finally {
    		 lock.unlock();
    	}
    }
       
      
}





class Resources
{
    private String name;
    private int count =1;
    private boolean flag =false;

    public synchronized void set(String name)
    {  //1)循环判断
       while(flag)
           try{this.wait();}catch(Exception e){}
       this.name = name+"--"+count++;

       try {
		Thread.sleep(200) ;
	} catch (InterruptedException e) {
		e.printStackTrace();
	}// 模拟生产耗时
       System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
       flag =true;
       //2)唤醒所有进程
       this.notifyAll();

    }
    public synchronized void out()
    {
       //1)循环判断
       while(!flag)
           try{this.wait();}catch(Exception e){}
       
       try {
   		Thread.sleep(200) ;
   	} catch (InterruptedException e) {
   		e.printStackTrace();
   	}// 模拟消费耗时
       System.out.println(Thread.currentThread().getName()+" ....消费者...."+this.name);
       flag =false;
       //2)唤醒所有进程
       this.notifyAll();

    }
}



 

分享到:
评论

相关推荐

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

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

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

    为了实现多个线程,我们可以使用`Thread`类或者`java.util.concurrent.ExecutorService`,后者提供了更高级的线程池管理功能。 ```java public class Producer implements Runnable { private Warehouse warehouse...

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

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

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

    在Qt5中,我们可以利用QSemaphore类来实现生产者和消费者的同步。QSemaphore提供了一种计数信号量机制,它维护一个非负整数值,允许特定数量的线程访问共享资源。当资源可用时,线程可以获取(acquire)一个许可证,...

    使用多线程程序模拟实现单生产者/多消费者问题(Linux下C语言)。

    使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...

    Linux 多线程实现生产者消费者模式.pdf

    Linux多线程实现生产者消费者模式涉及到操作系统中的多个重要知识点,包括多线程编程、生产者消费者模型、互斥量、条件变量等。在Linux环境下,这些功能可以通过POSIX线程(pthread)库来实现。下面详细解释这些知识...

    多线程实现生产者消费者

    本项目以"多线程实现生产者消费者"为主题,通过五个核心类:consumer(消费者)、producer(生产者)、product(产品)、storage(仓库)以及producerandconsumer(生产者消费者主类)来展示这一模型的应用。...

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

    在`JThreadSynch`这个压缩包文件中,我们可以预见到包含的Java源代码将展示以上的一种或多种机制,通过具体的示例代码来解释和实现生产者消费者问题的线程同步和互斥。通过学习和理解这个示例,开发者可以更好地掌握...

    C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

    本文将深入探讨C++中的多线程通信方式,并结合经典的生产者-消费者模式来阐述其实现。 一、C++多线程基础 C++11引入了标准库`<thread>`,提供了对多线程的支持。创建线程的基本方法是通过`std::thread`类,如下所示...

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

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

    python实现生产者消费者并发模型

    多线程实现生产者消费者模型:锁(Lock)、信号量(Semaphore、BoundedSemaphore)、条件(Condition)、队列(Queue)、事件(Event) 多进程程实现生产者消费者模型:信号量(Semaphore)、条件(Condition)、...

    Linux c语言多线程实现生产者/消费者问题

    以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 ...

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

    此外,`TestThread3.java`可能是测试此类模型的具体实现,它通常会创建多个生产者和消费者线程实例,并启动它们。每个线程会根据其角色调用相应的`produce()`或`consume()`方法。 在实际开发中,除了使用...

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

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

    多线程模拟实现生产者/消费者模型

    5. **信号量(可选)**:在某些实现中,可能还会使用`Semaphore`来控制生产者和消费者的数量,以限制同时工作的线程数。 在给定的压缩包文件"生产者与消费者代码"中,很可能包含了实现这一模型的示例代码。通过阅读...

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

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

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

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

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

    在实际应用中,生产者-消费者模型可以被扩展到多个生产者和多个消费者,且缓冲区大小可以动态调整。此外,为了防止死锁和饥饿现象,还需要考虑适当的同步策略,如公平性和优先级反转的处理。 总之,"生产者-消费者...

    多线程同步方法解决生产者-消费者问题(linux线程实现)

    设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符.(2)生产者和消费者各有两个以上.(3)多个生产者或多个消费者之间须有共享对缓冲区...

    生产者-消费者的Linux多线程实现.pdf

    通过使用互斥锁、条件变量、线程管理等相关函数,可以在 Linux 下实现多线程生产者-消费者问题,以提高资源利用率。本文对生产者-消费者问题的实现进行了详细的阐述,为读者提供了一个实用的参考。

Global site tag (gtag.js) - Google Analytics