㈠ java,LinkedList實現的共享消息隊列,要求可以多線程調用,隨便謝謝思路就OK
public class Queue {
private LinkedList<Object> msgList = new LinkedList<Object>();
public Object getMsg() {
synchronized (this) {
if (msgList != null && msgList.size() > 0) {
return msgList.removeFirst();
}
return null;
}
}
public Object addMsg(Object obj) {
synchronized(this) {
msgList.addLast(obj);
}
return obj;
}
}
前幾天給別人寫的,估計能實現你的要求的代碼,當然沒寫測試!
㈡ java.util.concurrent的隊列
java.util.concurrent ConcurrentLinkedQueue 類提供了高效的、可伸縮的、線程安全的非阻塞 FIFO 隊列。java.util.concurrent 中的五個實現都支持擴展的 BlockingQueue 介面,該介面定義了 put 和 take 的阻塞版本:LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue 和 DelayQueue。這些不同的類覆蓋了生產者-使用者、消息傳遞、並行任務執行和相關並發設計的大多數常見使用的上下文。
㈢ java 什麼情況下使用 並發隊列
並發隊列是一個基於鏈接節點的無界線程安全隊列,它採用先進先出的規則對節點進行排序,當我們添加一個元素的時候,它會添加到隊列的尾部,當我們獲取一個元素時,它會返回隊列頭部的元素。它採用了「wait-free」演算法來實現,該演算法在Michael
& Scott演算法上進行了一些修改。
入隊列
入隊列就是將入隊節點添加到隊列的尾部。為了方便理解入隊時隊列的變化,以及head節點和tair節點的變化,每添加一個節點我就做了一個隊列的快照圖。
publicEpoll(){
Node</e><e>h=head;
//p表示頭節點,需要出隊的節點
Node</e><e>p=h;
for(inthops=0;;hops++){
//獲取p節點的元素
Eitem=p.getItem();
//如果p節點的元素不為空,使用CAS設置p節點引用的元素為null,如果成功則返回p節點的元素。
if(item!=null&&p.casItem(item,null)){
if(hops>=HOPS){
//將p節點下一個節點設置成head節點
Node</e><e>q=p.getNext();
updateHead(h,(q!=null)?q:p);
}
returnitem;
}
//如果頭節點的元素為空或頭節點發生了變化,這說明頭節點已經被另外一個線程修改了。那麼獲取p節點的下一個節點
Node</e><e>next=succ(p);
//如果p的下一個節點也為空,說明這個隊列已經空了
if(next==null){
//更新頭節點。
updateHead(h,p);
break;
}
//如果下一個元素不為空,則將頭節點的下一個節點設置成頭節點
p=next;
}
returnnull;
}
首先獲取頭節點的元素,然後判斷頭節點元素是否為空,如果為空,表示另外一個線程已經進行了一次出隊操作將該節點的元素取走,如果不為空,則使用CAS的方式將頭節點的引用設置成null,如果CAS成功,則直接返回頭節點的元素,如果不成功,表示另外一個線程已經進行了一次出隊操作更新了head節點,導致元素發生了變化,需要重新獲取頭節點。
㈣ java中如何對某個方法或者某個代碼塊使用阻塞隊列來保證並發情況下線程是安全的
synchronize加在函數方法或者代碼塊,就能按你說的保證線程安全,原理是多線程進入時候系統會只允許一個線程執行那些語句
㈤ java有沒有循環隊列 線程安全
jdk沒有線程安全的循環隊列,
ConcurrentLinkedQueue是線程安全非阻塞的隊列
㈥ Java中關於如何實現多線程消息隊列的實例
java中的消息隊列
消息隊列是線程間通訊的手段:
import java.util.*
public class MsgQueue{
private Vector queue = null;
public MsgQueue(){
queue = new Vector();
}
public synchronized void send(Object o)
{
queue.addElement(o);
}
public synchronized Object recv()
{
if(queue.size()==0)
return null;
Object o = queue.firstElement();
queue.removeElementAt(0);//or queue[0] = null can also work
return o;
}
}
因為java中是locked by object的所以添加synchronized 就可以用於線程同步鎖定對象
可以作為多線程處理多任務的存放task的隊列。他的client包括封裝好的task類以及thread類
Java的多線程-線程間的通信2009-08-25 21:58
1. 線程的幾種狀態
線程有四種狀態,任何一個線程肯定處於這四種狀態中的一種:
1) 產生(New):線程對象已經產生,但尚未被啟動,所以無法執行。如通過new產生了一個線程對象後沒對它調用start()函數之前。
2) 可執行(Runnable):每個支持多線程的系統都有一個排程器,排程器會從線程池中選擇一個線程並啟動它。當一個線程處於可執行狀態時,表示它可能正處於線程池中等待排排程器啟動它;也可能它已正在執行。如執行了一個線程對象的start()方法後,線程就處於可執行狀態,但顯而易見的是此時線程不一定正在執行中。
3) 死亡(Dead):當一個線程正常結束,它便處於死亡狀態。如一個線程的run()函數執行完畢後線程就進入死亡狀態。
4) 停滯(Blocked):當一個線程處於停滯狀態時,系統排程器就會忽略它,不對它進行排程。當處於停滯狀態的線程重新回到可執行狀態時,它有可能重新執行。如通過對一個線程調用wait()函數後,線程就進入停滯狀態,只有當兩次對該線程調用notify或notifyAll後它才能兩次回到可執行狀態。
2. classThread下的常用函數函數
2.1 suspend()、resume()
1) 通過suspend()函數,可使線程進入停滯狀態。通過suspend()使線程進入停滯狀態後,除非收到resume()消息,否則該線程不會變回可執行狀態。
2) 當調用suspend()函數後,線程不會釋放它的「鎖標志」。
例11:
class TestThreadMethod extends Thread{
public static int shareVar = 0;
public TestThreadMethod(String name){
super(name);
}
public synchronized void run(){
if(shareVar==0){
for(int i=0; i<5; i++){
shareVar++;
if(shareVar==5){
this.suspend();//(1)
}}}
else{
System.out.print(Thread.currentThread().getName());
System.out.println(" shareVar = " + shareVar);
this.resume();//(2)
}}
}
public class TestThread{
public static void main(String[] args){
TestThreadMethod t1 = new TestThreadMethod("t1");
TestThreadMethod t2 = new TestThreadMethod("t2");
t1.start();//(5)
//t1.start();//(3)
t2.start();//(4)
}}
㈦ JAVA如何用隊列實現並發
如果是搶資源,在不作弊的情況下 按照先來先得的規則 ,那麼比較簡單的實現就是隊列 ,不管請求的並發多高,如果用線程來實現為用戶服務,也就是說 來一個人請求資源那麼就啟動一個線程,那CPU執行線程總是有順序的,比如 當前三個人(路人甲路人乙路人丙)請求A資源 ,那服務端就起了三個線程為這三個人服務,假設 這三個人不太幸運在請求的時候沒有及時的獲得CPU時間片,那麼他們三個相當於公平競爭CPU資源,而CPU選擇運行線程是不確定順序的 ,又假設 選中了路人丙的線程運行那麼將其放入隊列就好了,路人乙,路人丙以此類推 ,那可能會想為什麼不及時的處理呢 ,因為後續的操作可能是耗時操作對於線程的佔用時間較長那請求資源的人多了服務端就可能掛了
㈧ java 內部隊列ConcurrentLinkedQueue
這個隊列是JAVA自帶的,信息當然是存在內存中了,程序一關閉當然也會消失了
㈨ java多線程共同操作同一個隊列,怎麼實現
具體代碼如下: