三個類.
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* 放入隊列
* @author dmw
*
* 2018年9月27日
*/
public class MyProducer {
private ConcurrentLinkedQueue<String> queue;
public ConcurrentLinkedQueue<String> getQueue() {
return queue;
}
public void setQueue(ConcurrentLinkedQueue<String> queue) {
this.queue = queue;
}
public MyProducer(ConcurrentLinkedQueue<String> queue) {
super();
this.queue = queue;
}
/**
* 放入方法
* @param val
*/
public void put(String val){
queue.add(val);
}
}
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* 處理隊列
* @author dmw
*
* 2018年9月27日
*/
public class MyCustomer implements Runnable{
private ConcurrentLinkedQueue<String> queue;
public ConcurrentLinkedQueue<String> getQueue() {
return queue;
}
public void setQueue(ConcurrentLinkedQueue<String> queue) {
this.queue = queue;
}
public MyCustomer(ConcurrentLinkedQueue<String> queue) {
super();
this.queue = queue;
}
/**
* 處理方法
*/
@Override
public void run() {
while(true){
String poll = queue.poll();//取出第一個並移除
if (poll != null){
System.out.println("處理了:"+poll);//處理
System.out.println("此時容器裏還有"+queue.size()+"個");//這個size()實際上是預期值.不能作爲嚴格值
}
try {
Thread.currentThread().sleep(1000);//休息一秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
測試效果非常不錯.不懂的同學先運行看看.就知道怎麼回事了.
import java.util.concurrent.ConcurrentLinkedQueue;
public class Test {
public static void main(String[] args) throws InterruptedException {
ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
MyProducer producer = new MyProducer(queue );
MyCustomer customer = new MyCustomer(queue);
/**
* 隊列預先插入3個
*/
producer.put("aaa");
producer.put("bbb");
producer.put("ccc");
/**
* 隊列處理開始
*/
new Thread(customer).start();
/**
* 先睡下
*/
Thread.currentThread().sleep(2000);
/**
* 後續插入20條試試看
*/
for (int i = 100; i < 120; i++) {
producer.put(""+i);
}
}
}