Kafka 延遲操作模組(二) Timer定時器

2021-10-09 22:27:55 字數 2071 閱讀 5437

上面介紹的 timingwheel 提供了新增延時任務和推進時間輪指標的操作,而具體執行延時任務的操作則交由定時器 systemtimer 完成。systemtimer 類實現了 timer 特質,該特質描繪了定時器應該具備的基本方法。timer 介面定義了管理延遲操作的方法,而 systemtimer 是實現延遲操作的關鍵**。

timer 介面定義如下:

trait timer
systemtimer 類是 timer 介面的實現類,它的定義如下:

class systemtimer(executorname: string, // purgatory 的名字

tickms: long = 1, // 預設時間格時間為 1 毫秒

wheelsize: int = 20, // 預設時間格大小為 20

startms: long = time.system.hiresclockms // 該 systemtimer 定時器啟動時間

) extends timer )

// 延遲佇列儲存所有bucket,即所有timertasklist物件

private[this] val delayqueue = new delayqueue[timertasklist]()

// 總定時任務數

private[this] val taskcounter = new atomicinteger(0)

// 時間輪物件

private[this] val timingwheel = new timingwheel(

tickms = tickms,

wheelsize = wheelsize,

startms = startms,

taskcounter = taskcounter,

delayqueue

) // locks used to protect data structures while ticking

// 維護執行緒安全的讀寫鎖

private[this] val readwritelock = new reentrantreadwritelock()

private[this] val readlock = readwritelock.readlock()

private[this] val writelock = readwritelock.writelock()

}

systemtimer 類最重要的方法是 add 和 advanceclock 方法,因為它們是真正對外提供服務的。

add 方法

作用是將給定的定時任務插入到時間輪中進行管理。

def add(timertask: timertask): unit =  finally 

}

// add 方法就是呼叫 addtimertaskentry 方法執行插入動作  

private def addtimertaskentry(timertaskentry: timertaskentry): unit =

}

advanceclock 方法

顧名思義,它的作用是驅動時鐘向前推進

/** 將延時任務重新新增到時間輪中 */

private[this] val reinsert = (timertaskentry: timertaskentry) => addtimertaskentry(timertaskentry)

/** advances the clock if there is an expired bucket. if there isn't any expired bucket when called,

* waits up to timeoutms before giving up.

*/def advanceclock(timeoutms: long): boolean =

} finally

true

} else

}

定時執行緒 Timer 操作UI介面

需求 先彈出dialog,然後,隔一定時間,修改dialog的msg.如果只是dismiss dialog 並不需要透過handle runonuithread 如果開啟新的定時執行緒,不起作用.android的執行緒通訊透過handle來處理,這裡也一樣 public static void sh...

C task和timer實現定時操作

c 中,定時器,或者叫作間隔器,每隔一段時間執行乙個操作。1.timer本身就是多執行緒 c 中為不同場合下使用定時器,提供了不同的timer類,在asp.net中一般使用system.timers.timer。這個類也很簡單,在微軟官方文件可以檢視如何使用。c 的timer,本身就封裝了執行緒的操...

kafka筆記二操作

提示 首先需要啟動kafka服務,啟動kafka服務之前要啟動zk 檢視當前伺服器中所有的topic kafka topics.sh list zookeeper 192.168.56.20 2181建立topic kafka topics.sh create zookeeper 192.168.5...