黑马程序员技术交流社区
标题:
多线程之多生产多消费者问题
[打印本页]
作者:
暗影流光
时间:
2014-7-9 19:33
标题:
多线程之多生产多消费者问题
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);
}
}
复制代码
作者:
霜林醉zhx
时间:
2014-7-10 12:29
没搞懂你要表达什么
作者:
a6511631
时间:
2014-7-10 12:52
不能理解你的问题在哪
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2