生产者/消费者问题_2
class
Storage2{
private
final
int
MAX_SIZE =
100
;
private
List<Object> list =
new
LinkedList<Object>();
private
Lock lock =
new
ReentrantLock();
private
Condition full = lock.newCondition();
private
Condition empty = lock.newCondition();
public
void
produce(
int
num){
lock.lock();
while
(list.size() + num > MAX_SIZE){
System.out.println(
"线程:"
+ Thread.currentThread().getId() +
" --> "
+
"需要生产的产品:"
+ num +
",库存:"
+ list.size() +
"暂时无法执行生产任务."
);
try
{
full.await();
}
catch
(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for
(
int
i=
0
; i<num; i++){
list.add(
new
Object());
}
System.out.println(
"线程:"
+ Thread.currentThread().getId() +
" --> "
+
"已生产产品数:"
+ num +
",库存:"
+ list.size());
full.signalAll();
empty.signalAll();
lock.unlock();
}
public
void
consume(
int
num){
lock.lock();
while
(list.size() < num){
System.out.println(
"线程:"
+ Thread.currentThread().getId() +
" --> "
+
"需要消费产品:"
+ num +
",库存:"
+ list.size() +
"暂时无法提供消费服务."
);
try
{
empty.await();
}
catch
(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for
(
int
i=
0
; i<num; i++)
list.remove(
0
);
System.out.println(
"线程:"
+ Thread.currentThread().getId() +
" --> "
+
"消费:"
+ num +
",库存:"
+ list.size());
empty.signalAll();
full.signalAll();
lock.unlock();
}
public
List<Object> getList() {
return
list;
}
public
void
setList(List<Object> list) {
this
.list = list;
}
public
int
getMAX_SIZE() {
return
MAX_SIZE;
}
}
class
Producer2
extends
Thread{
private
int
num;
private
Storage2 storage;
public
Producer2(Storage2 storage) {
super
();
this
.storage = storage;
}
@Override
public
void
run() {
// TODO Auto-generated method stub
produce(num);
}
public
int
getNum() {
return
num;
}
public
void
setNum(
int
num) {
this
.num = num;
}
public
void
produce(
int
sum){
this
.storage.produce(sum);
}
}
class
Consumer2
extends
Thread{
private
int
num;
private
Storage2 storage;
public
Consumer2(Storage2 storage) {
super
();
this
.storage = storage;
}
public
int
getNum() {
return
num;
}
public
void
setNum(
int
num) {
this
.num = num;
}
public
void
consumer(
int
sum){
this
.storage.consume(sum);
}
@Override
public
void
run() {
// TODO Auto-generated method stub
consumer(num);
}
}
public
class
ProducerConsumerMode_2 {
public
static
void
main(String[] args){
Storage2 storage =
new
Storage2();
Producer2[] p =
new
Producer2[
10
];
Consumer2[] s =
new
Consumer2[
10
];
for
(
int
i=
0
; i<
10
; i++){
int
num;
num = (
int
) (Math.random()*
30
);
p[i] =
new
Producer2(storage);
p[i].setNum(num);
num = (
int
) (Math.random()*
30
);
s[i] =
new
Consumer2(storage);
s[i].setNum(num);
}
for
(
int
i=
0
; i<
10
; i++){
p[i].start();
s[i].start();
}
}