package threadTest;import java.util.ArrayList;import java.util.List;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class MyProducerConsumerTest {/*** @param args* @throws InterruptedException*/public static void main(String[] args) throws InterruptedException {Repository201521123094 repo = new Repository201521123094();Thread producer = new Thread(new Producer(repo, 100));// 放入100个Thread consumer = new Thread(new Consumer(repo, 100));// 取出100个producer.start();consumer.start();producer.join();consumer.join();System.out.format("main end!仓库还剩%d个货物%n", repo.size());}}class Repository201521123094 {// 存放字符串的仓库private int capacity = 10;// 仓库容量默认为10private List<String> repo = new ArrayList<String>();// repo(仓库),最多只能放10个// ReentrantLock lock = new ReentrantLock();// Condition Con = lock.newCondition();//// public synchronized void add(String t) {// lock.lock();// try {// while (repo.size() >= capacity) {// System.out.println("仓库已满!无法添加货物。");// try {// Con.await();// } catch (InterruptedException e) {// e.printStackTrace();// }// }// repo.add(t);// System.out.println("已添加");// Con.signal();// } finally {// lock.unlock();// }// }//// public synchronized void remove() {// lock.lock();// try {// while (repo.size() <= 0) {// System.out.println("仓库无货!无法从仓库取货");// try {// Con.await();// } catch (InterruptedException e) {// e.printStackTrace();// }// repo.remove(0);// System.out.println("已取货");// Con.signal();// }// } finally {// lock.unlock();// }// }public synchronized void add(String t) {while (repo.size() >= capacity) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("仓库已满!无法添加货物。");}repo.add(t);notifyAll();}public synchronized void remove() {while (repo.size() <= 0) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("仓库无货!无法从仓库取货");}repo.remove(0);notifyAll();}public synchronized int size() {return repo.size();}}class Producer implements Runnable {private Repository201521123094 repo;private int count;// 让Producer放入count次public Producer(Repository201521123094 repo, int count) {this.repo = repo;this.count = count;}@Overridepublic void run() {for (int i = 0; i < count; i++) {repo.add(new String("sth"));// 每回都放入一个新的货物(字符串对象)}System.out.format("放入%d个货物完毕!%n", count);}}class Consumer implements Runnable {private Repository201521123094 repo;private int count;// 让Consumer取count次public Consumer(Repository201521123094 repo, int count) {this.repo = repo;this.count = count;}@Overridepublic void run() {for (int i = 0; i < count; i++) {repo.remove();// 每回都从仓库中取出一个货物}System.out.format("取出%d个货物完毕!%n", count);}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。