zoukankan      html  css  js  c++  java
  • 多线程之多生产多消费者

    import java.util.concurrent.locks.*;
    
    public class Test23 {
    	public static void main(String[] args) {
    		Resource r = new Resource();
    		String x = "黄焖鸡";
    
    		PutX px = new PutX(r, x);
    		TakeX tx = new TakeX(r, x);
    		Thread t0 = new Thread(px);
    		Thread t1 = new Thread(px);
    		Thread t2 = new Thread(tx);
    		Thread t3 = new Thread(tx);
    
    		t0.start();
    		t1.start();
    		t2.start();
    		t3.start();
    	}
    }
    
    class Resource {
    
    	Lock lock = new ReentrantLock();
    	Condition full = lock.newCondition();
    	Condition empty = lock.newCondition();
    
    	private String[] item = new String[400];
    	private int taker = 0;
    	private int puter = 0;
    	private int count = 0;
    
    	public void put(String x) {
    		while (true) {
    			lock.lock();
    			//用while不用if是由于当多个线程在这里等待后,被唤醒,须要又一次推断这个条件
    			while (count == item.length) {
    				try {
    					full.await();
    				} catch (InterruptedException e) {
    				}
    			}
    			item[puter] = x;
    			System.out.println(Thread.currentThread().getName() + "..." + count
    					+ "...put.." + x);
    			if (puter == item.length - 1) {
    				puter = -1;
    				empty.signalAll();
    			}
    			++count;
    			++puter;
    			lock.unlock();
    		}
    	}
    
    	public void take(String x) {
    		while (true) {
    			lock.lock();
    			while (count == 0) {
    				try {
    					empty.await();
    				} catch (InterruptedException e) {
    				}
    			}
    			x = item[taker];
    			System.out.println(Thread.currentThread().getName() + "..."
    					+ (count - 1) + "..take......" + x);
    			if (taker == item.length - 1) {
    				taker = -1;
    				full.signalAll();
    			}
    			--count;
    			++taker;
    			lock.unlock();
    		}
    	}
    }
    
    class PutX implements Runnable {
    	Resource r;
    	String x;
    
    	PutX(Resource r, String x) {
    		this.r = r;
    		this.x = x;
    	}
    
    	public void run() {
    		r.put(x);
    	}
    }
    
    class TakeX implements Runnable {
    	Resource r;
    	String x;
    
    	TakeX(Resource r, String x) {
    		this.r = r;
    		this.x = x;
    	}
    
    	public void run() {
    		r.take(x);
    	}
    }
    

  • 相关阅读:
    搭建MHA问题汇总
    NOIP2009 靶形数独
    get_mysql_conn_info.py
    NOIP 2005 篝火晚会
    MySQL启动关闭添加到 /etc/init.d/mysqld
    noip2002 矩形覆盖
    get_slave_status.py
    [JSOI2008]魔兽地图
    MySQL数据导出导入任务脚本
    8.30 牛客OI赛制测试赛1 F题 子序列
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5094323.html
Copyright © 2011-2022 走看看