工作中我們經(jīng)常會(huì)遇到一些一些功能需要實(shí)現(xiàn)造作日志,數(shù)據(jù)修改日志,對(duì)于這種業(yè)務(wù)需求如果我們以同步的方式實(shí)現(xiàn),難免會(huì)影響到系統(tǒng)的性能。如下我列出集中解決方案。
使用Thread異步處理。
使用線程池或Task異步處理。
以上兩種方案確實(shí)能解決我們此場(chǎng)景的需求,但是同時(shí)也帶來(lái)了問題。
第一種方式,使用thread的情況下我們無(wú)法控制創(chuàng)建的線程數(shù)量,要知道創(chuàng)建線程是一個(gè)很耗性能的操作。
第二種方式,使用線程池或者Task我們雖然可以通過設(shè)置線程池的最大線程數(shù)量來(lái)限制線程最大數(shù),但是這個(gè)設(shè)置由于是全局的,就會(huì)造成所有使用線程池或Task的地方都會(huì)受到此設(shè)置的限制。
當(dāng)然,第二種方式肯定是優(yōu)于第一種方式的,我們都是有追求的程序員,做事情當(dāng)然是追求精益求精?;诖怂枷氲尿?qū)動(dòng)我實(shí)現(xiàn)了一個(gè)輕量級(jí)的多線程隊(duì)列。她有如下特點(diǎn):
可以設(shè)置線程數(shù)量,空閑睡眠次數(shù),空閑睡眠時(shí)間。空閑睡眠次數(shù)和空閑睡眠時(shí)間共同控制線程的銷毀。
可以設(shè)置任務(wù)的優(yōu)先級(jí),提供三種優(yōu)先級(jí):LOWEST,NORMAL,HIGHEST。
可以設(shè)置多線程的模式是使用Thread還是使用Task.
可以提高任務(wù)的優(yōu)先級(jí)。
當(dāng)然首先要說(shuō)的是使用方法,當(dāng)我設(shè)置使用一個(gè)線程的時(shí)候如下代碼:
輸出結(jié)果如下
可以看到使用QueueManager類的線程都是id=4的線程上執(zhí)行,這是由于我們?cè)O(shè)置的是一個(gè)線程,主線程的id為1,并且可以看到Job中的代碼是異步執(zhí)行的。當(dāng)我們將線程數(shù)設(shè)置成2的時(shí)候輸出如下
使用其它是不是很簡(jiǎn)單??
那么我分別來(lái)講一下QueueManager類的參數(shù)
QueueConfirguration類,結(jié)構(gòu)如下。
TaskMaxCount:線程數(shù)量,TaskDelay:為空閑時(shí)線程睡眠時(shí)間(ms單位),delayTimes:睡眠次數(shù)
2. QueueTaskMode:枚舉類型,提供兩種多線程使用方式Thread和Task
3.JobPriorityScheduleConfig:實(shí)現(xiàn)接口IJobPriorityScheduleConfig,用來(lái)提升Job的優(yōu)先級(jí)。
各位朋友可能也看到了我使用了一個(gè)Job類,目前總共有三種Job類型
Job:無(wú)參數(shù)無(wú)返回
Job<T>:有參數(shù)無(wú)返回
Job<T1, T2> :有參數(shù)有返回, 同時(shí)提供執(zhí)行完成之后返回參數(shù)的callback事件。
當(dāng)然,代碼中還有很多地方可以優(yōu)化,譬如:
當(dāng)線程處于睡眠中時(shí),有Job需要執(zhí)行時(shí)的interrupt.
AddJob方法可以加一些重載。
實(shí)現(xiàn)中的事件可以修改為委托,以達(dá)到減少一些委托類型的定義。