生产者-消费者模式(异步、线程间)
package com. lx. day0428;
import java. util. LinkedList;
import lombok. extern. slf4j. Slf4j;
@Slf4j
public class Test {
public static void main ( String[ ] args) {
MessageQueue messageQueue = new MessageQueue ( 2 ) ;
for ( int i = 0 ; i < 3 ; i++ ) {
int id = i;
new Thread ( ( ) - > {
messageQueue. put ( new Message ( id, "值" + id) ) ;
} , "生产者" + id) . start ( ) ;
}
new Thread ( ( ) - > {
while ( true ) {
try {
Thread. sleep ( 1000 ) ;
Message message = messageQueue. take ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
} , "消费者" ) . start ( ) ;
}
}
@Slf4j
class MessageQueue {
private LinkedList< Message> list = new LinkedList < Message> ( ) ;
private int capcity;
public MessageQueue ( int capcity) {
this . capcity = capcity;
}
public Message take ( ) {
synchronized ( list) {
while ( list. isEmpty ( ) ) {
try {
log. info ( "队列为空,消费者线程等待" ) ;
list. wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
Message message = list. removeFirst ( ) ;
log. info ( "已消费一个消息:{}" , message) ;
list. notifyAll ( ) ;
return message;
}
}
public void put ( Message message) {
synchronized ( list) {
while ( list. size ( ) == capcity) {
try {
log. info ( "队列已满,生产者线程等待" ) ;
list. wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
list. addLast ( message) ;
log. info ( "已生产一个消息:{}" , message) ;
list. notifyAll ( ) ;
}
}
}
final class Message {
private int id;
private Object value;
public Message ( int id, Object value) {
this . id = id;
this . value = value;
}
public int getId ( ) {
return id;
}
public void setId ( int id) {
this . id = id;
}
@Override
public String toString ( ) {
return "Message [id=" + id + ", value=" + value + "]" ;
}
}