事件隊列如何實現去中心
『壹』 消息隊列中的事件如何觸發
一個事件產生一個消息,消息進入自己的消息隊列,再把消息派發到各個自己的消息響應函數里去實現事件的響應
『貳』 下面是一個用js來實現的獲取隊列信息的方法,我要怎麼把它改成java代碼,來取得隊列中的值。
這個 是websocket, JAVA 中要使用第3方庫,,,,如 TooTallNate-Java-WebSocket
~~~~~~~
『叄』 事件隊列和消息隊列之間的區別
事件是一個動作——用戶觸發的動作。
消息是一個信息——傳遞給系統的信息。
事件與消息的概念在計算機中較易混淆,但本質不同:
事件由用戶(操作電腦的人)觸發且只能由用戶觸發,操作系統能夠感覺到由用戶觸發的事件,並將此事件轉換為一個(特定的)消息發送到程序的消息隊列中。
這里強調的是:
可以說「用戶觸發了一個事件」,而不能說「用戶觸發了一個消息」。
用戶只能觸發事件,而事件只能由用戶觸發。
一個事件產生後,將被操作系統轉換為一個消息,所以一個消息可能是由一個事件轉換而來(或者由操作系統產生)。
一個消息可能會產生另一個消息,但一個消息決不能產生一個事件——時間只能由用戶觸發。
總結(事件:消息的來源)
事件:只能由用戶通過外設的輸入產生。
消息:(產生消息的來源有三個)
(1) 由操作系統產生。
(2) 由用戶觸發的事件轉換而來。
(3) 由另一個消息產生。
『肆』 到底什麼是消息隊列Java中如何實現消息隊列
「消息隊列」是在消息的傳輸過程中保存消息的容器。和我們學過的LinkedHashMap,TreeSet等一樣,都是容器。既然是容器,就有有自己的特性,就像LinkedHashMap是以鍵值對存儲。存取順序不變。而消息隊列,看到隊列就可以知道。這個容器裡面的消息是站好隊的,一般遵從先進先出原則。
java中已經為我們封裝好了很多的消息隊列。在java 1.5版本時推出的java.util.concurrent中有很多現成的隊列供我們使用。特性繁多,種類齊全。是你居家旅遊開發必備QAQ。
下面簡單列舉這個包中的消息隊列
:阻塞隊列 BlockingQueue
數組阻塞隊列 ArrayBlockingQueue
延遲隊列 DelayQueue
鏈阻塞隊列 LinkedBlockingQueue
具有優先順序的阻塞隊列 PriorityBlockingQueue
同步隊列 SynchronousQueue
阻塞雙端隊列 BlockingDeque
鏈阻塞雙端隊列 LinkedBlockingDeque
不同的隊列不同的特性決定了隊列使用的時機,感興趣的話你可以詳細了解。具體的使用方式我就不贅述了
『伍』 java中如何實現按隊列執行任務
package com.tone.example;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.tone.task.TaskProperty;
import com.tone.task.TaskSignature;
import com.tone.task.impl.BasicTask;
import com.tone.task.runner.TaskRunner;
/**
* 任務隊列示常式序
* @author zlf
*/
public class TaskExample {
private TaskRunner taskRunner;
/**
* 做任務隊列的初始化工作
*/
@Before
public void init() {
// 獲取任務運行器
taskRunner = TaskRunner.getInstance();
// 將任務運行器放入線程進行調度
Thread thread = new Thread(taskRunner);
thread.start();
}
/**
* 等待任務執行完成,並做最後的退出工作
*/
@After
public void exit() throws InterruptedException {
Thread.sleep(600);
System.exit(0);
}
/**
* 最簡單的任務運行示例
*/
@Test
public void example1() {
// 添加任務到任務運行器
taskRunner.addTask(new BasicTask() {
@Override
public void run() {
System.out.println("This is running in task runner thread, and thread is " + Thread.currentThread());
}
});
}
/**
* 加入優先執行順序的任務運行器
*/
@Test
public void example2() {
// 添加任務到任務運行器
taskRunner.addTask(new BasicTask(0) {
@Override
public void run() {
System.out.println("This is a normal task");
}
});
taskRunner.addTask(new BasicTask(-1) {
@Override
public void run() {
System.out.println("This is a task a bit high than normal");
}
});
}
/**
* 重復添加的任務只會運行第一個
*/
@Test
public void example3() {
// 添加任務到任務運行器
taskRunner.addTask(new BasicTask(TaskSignature.ONE) {
@Override
public void run() {
System.out.println("This is task one");
}
}, TaskProperty.NOT_REPEAT);
taskRunner.addTask(new BasicTask(TaskSignature.ONE) {
@Override
public void run() {
System.out.println("This is also task one");
}
}, TaskProperty.NOT_REPEAT);
}
/**
* 重復添加的任務只會運行最後一個
*/
@Test
public void example4() {
// 添加任務到任務運行器
taskRunner.addTask(new BasicTask(TaskSignature.ONE) {
@Override
public void run() {
System.out.println("This is task one");
}
}, TaskProperty.NOT_REPEAT_OVERRIDE);
taskRunner.addTask(new BasicTask(TaskSignature.ONE) {
@Override
public void run() {
System.out.println("This is also task one");
}
}, TaskProperty.NOT_REPEAT_OVERRIDE);
}
}
『陸』 如何實現自動監聽消息隊列里的值
通過使用微軟的 消息隊列(MSMQ),然後在控制台應用程序里加一個線程監聽,這樣只要發現有值就可以執行應該執行的程序。
『柒』 消息隊列怎麼實現消息傳送
一般來說,這個程序是不可以用的!
『捌』 C#如何取消事件隊列,就是一個事件未執行完時再次觸發事件,後面的事件不進入隊列
想取消是不可能的了,這是 CLR 自己處理的而不是你寫的。
但可以換種思路,題主的要求不就是同一個事件之間要互斥嗎?可以設置一個 flag。事件進入方法後先判斷該 flag 是否為 false,如果是則改為 true 並繼續執行,否則跳出該方法。過程執行結束後再改回 false。
『玖』 隊列有哪些操作,分別說明這些操作實現的步驟與方法
以下是兩個線程:
import java.util.*;
public class Thread_List_Operation {
//假設有這么一個隊列
static List list = new LinkedList();
public static void main(String[] args) {
Thread t;
t = new Thread(new T1());
t.start();
t = new Thread(new T2());
t.start();
}
}
//線程T1,用來給list添加新元素
class T1 implements Runnable{
void getElemt(Object o){
Thread_List_Operation.list.add(o);
System.out.println(Thread.currentThread().getName() + "為隊列添加了一個元素");
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
getElemt(new Integer(1));
}
}
}
//線程T2,用來給list添加新元素
class T2 implements Runnable{
void getElemt(Object o){
Thread_List_Operation.list.add(o);
System.out.println(Thread.currentThread().getName() + "為隊列添加了一個元素");
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
getElemt(new Integer(1));
}
}
}
//結果(亂序)
Thread-0為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
『拾』 事件隊列是什麼_
舉個簡單的例子去食堂吃飯需要排隊,假如食堂使我們的程序,那麼排隊打飯的就是一個事件隊列。