思路: 将LinkedList作为阻塞队列,容量为capacity
使用4个生产者线程,不断的按序生产abcd放入阻塞队列LinkedList中
使用1个消费者线程,从阻塞队列中取出数据并打印
@Slf4j(topic = "c.mainTest")
public class MainTest {
static Object object = new Object();
static int index = 0;
static LinkedList<String> list = new LinkedList<>();
static int capacity = 8;
public static void main(String[] args) {
new Thread(() -> {
put("a", 0);
}, "生产者1").start();
new Thread(() -> {
put("b", 1);
}, "生产者2").start();
new Thread(() -> {
put("c", 2);
}, "生产者3").start();
new Thread(() -> {
put("d", 3);
}, "生产者4").start();
new Thread(() -> {
get();
}, "消费者线程").start();
}
public static void put(String s, int target) {
while (true) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object) {
while (index % 4 != target || list.size()>=capacity) {
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
log.debug("生产" + s);
list.add(s);
index++;
object.notifyAll();
}
}
}
public static void get() {
while (true) {
synchronized (object) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (list.isEmpty()) {
try {
log.debug("队列为空");
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String s = list.removeFirst();
log.debug("取出数据" + s);
object.notifyAll();
}
}
}
}