[多线程]经典例子——生成者消费者

这里使用了BlockingQueue,实例化使用ArrayBlockingQueue。

 

BlockingQueue本来是就是线程安全的。

当然,也可以自己构建其他的容器类来实现。

如,concurrentHashMap , 使用线程安全synchronized 方法进行 ArrayList对象的get set。

或者用一个violate关键字声明的对象。

还有使用concurrentLock的。

 

方法多样,随你喜好:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

//多线程之  生成者 消费者 
public class TestConsumer {
	/**
  	  * 生产者
        */
	class Producer implements Runnable{
		final BlockingQueue queue ;
		
		Producer(BlockingQueue q){
			this.queue = q;
		}
		@Override
		public void run() {
			try{
				for(int i =0 ;i<25;i++){
					queue.put(produce()+i);
				}
				System.out.println("生产后:"+queue.peek());
			}
			catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		
		String produce() {
			return "产品 ";
		}
		
	}


	
	/**
  	  * 消费者
        * @author wasw100
       */
   class Consumer implements Runnable{
	   final BlockingQueue<String> queue;
	   
	   Consumer(BlockingQueue q){
		   this.queue = q;
	   }
	   
	   @Override
		public void run() {
		   try{
		   while(true){
			   consume(queue.take());
			   Thread.sleep(1000);
		   }
		   }catch(InterruptedException e){
			   e.printStackTrace();
		   }
	   }
	   
	   void  consume(String s){
		   System.out.println("Thread:"+Thread.currentThread().getName()+"消费:" + s);
	   }
	   
   }



   
	
	//仓库,生产者消费者共享的资源,接口
	private static BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10); 
	
  public static void main(String[] args) {
	ExecutorService service = Executors.newCachedThreadPool();
	 
	TestConsumer test = new TestConsumer();
	Producer pro = test.new Producer(queue);
	Consumer con1 = test.new Consumer(queue);
	Consumer con2 = test.new Consumer(queue);
	 
	service.submit(pro);
	service.submit(con1);
	service.submit(con1);
	try {
		Thread.sleep(50500);
		} 
	catch (Exception e) {
		e.printStackTrace();
	  }   
	
	service.shutdown();
	System.exit(0);
  }
  
    
}

 

你可能感兴趣的:(多线程)