上面介紹的 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...