多个线程共享一个资源,提高处理速度和效率
package queue.demo;
import java.util.Arrays;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* @author liuchaojun 并发队列ConcurrentLinkedQueue的使用
* @date 2018-4-12 下午04:45:55
*/
public class ConcurrentQueue {
public static void main(String[] args) {
ToyotaYQ yq = new ToyotaYQ();
new Thread(yq, "线程1").start();
new Thread(yq, "线程2").start();
new Thread(yq, "线程3").start();
}
}
/**
* 任务来源
*/
class MQ {
private static Queue<String> queue = null; // 并发队列(线程安全)
/**
* 初始化并发队列
*/
public static Queue<String> initQueue() {
if (queue == null) {
queue = new ConcurrentLinkedQueue<String>();
}
String tasklist = "JFGHFG,JFSHFAG,JFSJDDG,JFSHFCG,JFSHFBG,JFSHFBG,JFSHFCG,JFBRDCG,JFBRDBG,JFSHFAG,JFSHFXAG,JFBMDBG,JFBMDXAG,JFBMDEG";
String[] split = tasklist.split(",");
List<String> task = Arrays.asList(split); // 数组转集合
queue.addAll(task); // 按照集合中元素的顺序将集合中全部元素放进队列
return queue;
}
}
/**
* 制单客户端
*/
class ToyotaYQ implements Runnable {
private static final Object lock = new Object();
private static Queue<String> queueYQ = MQ.initQueue();
@Override
public void run() {
while (true) {
synchronized (lock) { // 尽量减小锁的粒度和范围
String thisVIN = queueYQ.poll();//获取并移除此队列的头,如果此队列为空,则返回 nul
if (thisVIN == null) {
break;
}
System.out.println(Thread.currentThread().getName() + "成功制单:"
+ thisVIN + "。剩余:" + queueYQ.size() + "个任务");
}
}
}
}