高併發:佇列Queue
阿新 • • 發佈:2019-01-08
檢視Queue介面和類樹狀結構(F4顯示)
高併發佇列ConcurrentLinkedQueue
無鎖,基於連結節點的無界限執行緒安全佇列(不懂),先進先出,元素不能為null; 無界
1.新增 add() / offer()
阻塞佇列BlockingQueue
1.取頭元素:poll() 取且刪除,peek()取而不刪
帶優先順序的PriorityBlockingQueue
元素必須實現Comparable介面。
帶超時時間的DelayQueue
元素必須實現Delayed介面。
使用場景:對快取超時的資料刪除、空閒連線關閉。
//應用
import java.util.concurrent.DelayQueue;
public class WangBa implements Runnable {
private DelayQueue<Wangmin> queue = new DelayQueue<Wangmin>();
public boolean yinye =true;
public void shangji(String name,String id,int money){
Wangmin man = new Wangmin(name, id, 1000 * money + System.currentTimeMillis());
System.out.println("網名" +man.getName()+" 身份證"+man.getId()+"交錢"+money+"塊,開始上機...");
this.queue.add(man);
}
public void xiaji(Wangmin man){
System.out.println("網名"+man.getName()+" 身份證"+man.getId()+"時間到下機...");
}
@Override
public void run() {
while(yinye){
try {
Wangmin man = queue.take();
xiaji(man);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]){
try{
System.out.println("網咖開始營業");
WangBa siyu = new WangBa();
Thread shangwang = new Thread(siyu);
shangwang.start();
siyu.shangji("路人甲", "123", 1);
siyu.shangji("路人乙", "234", 10);
siyu.shangji("路人丙", "345", 5);
}
catch(Exception e){
e.printStackTrace();
}
}
}
//網民(元素)
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class Wangmin implements Delayed {
private String name;
//身份證
private String id;
//截止時間
private long endTime;
//定義時間工具類
private TimeUnit timeUnit = TimeUnit.SECONDS;
public Wangmin(String name,String id,long endTime){
this.name=name;
this.id=id;
this.endTime = endTime;
}
public String getName(){
return this.name;
}
public String getId(){
return this.id;
}
/**
* 用來判斷是否到了截止時間
*/
@Override
public long getDelay(TimeUnit unit) {
//return unit.convert(endTime, TimeUnit.MILLISECONDS) - unit.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
return endTime - System.currentTimeMillis();
}
/**
* 相互批較排序用
*/
@Override
public int compareTo(Delayed delayed) {
Wangmin w = (Wangmin)delayed;
return this.getDelay(this.timeUnit) - w.getDelay(this.timeUnit) > 0 ? 1:0;
}
}