Java多线程生产、消费消息队列示例
package com.zf.util;
import lombok.extern.slf4j.Slf4j;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* 多线程消费消息队列
*
* @version 1.0
* @company: zf
* @author: zf
*/
@Slf4j
public class QueueDemo {
private static Queue<String> queue = new ConcurrentLinkedQueue<String>();
private static final int threadNum = 3;
public static void main(String[] args) throws Exception {
insertThread it = new insertThread();
it.start();
ConcumerThread pt;
for (int i = 0; i < threadNum; i++) {
pt = new ConcumerThread();
pt.start();
}
}
public static boolean insert(String str) throws Exception {
System.out.println("新增:" + str + " , 当前数量:" + queue.size());
queue.offer(str);
if (queue.size() > 1000) {
// TODO
}
return true;
}
public synchronized static String get() {
if (queue.isEmpty()) {
return null;
}
return queue.poll();
}
}
/**
* 消费
*/
class ConcumerThread extends Thread {
public ConcumerThread() {
}
@Override
public void run() {
String str = "";
while (true) {
str = QueueDemo.get();
if (str == null) {
System.out.println("队列数据为空!");
try {
Thread.sleep(3 * 1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(Thread.currentThread().getName() + "=" + str);
}
}
}
}
/**
* 生产
*/
class insertThread extends Thread {
public insertThread() {
}
@Override
public void run() {
int i = 0;
while (true) {
try {
QueueDemo.insert("生产:" + (i++));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
参考侵删