线程令牌
最近在項(xiàng)目中碰到一個(gè)很頭疼的問(wèn)題,在前端連接事件中寫了一個(gè)廣播線程,該廣播線程寫在while循環(huán)中,但是前臺(tái)會(huì)有很多個(gè)客戶端,沒(méi)連接一次就會(huì)有一個(gè)廣播線程開(kāi)啟,很吃資源,剛開(kāi)始我解決這個(gè)問(wèn)題的方法是每次觸發(fā)連接事件是檢測(cè)一下當(dāng)前連接數(shù),如果是count_client<=1,就開(kāi)線程,否則跳過(guò)廣播,但這個(gè)方法只適用于連接事件中判斷,如果我是在接收事件中,根據(jù)接收結(jié)果開(kāi)啟廣播線程,那么就無(wú)法通過(guò)連接數(shù)來(lái)判斷是否該開(kāi)啟廣播,我思考了好久,想起算法中有個(gè)token的概念,在此可以拿來(lái)一用。
在程序中設(shè)置一個(gè)全局線程變量tokenThread,其相當(dāng)于一個(gè)令牌,擁有令牌的線程則擁有開(kāi)啟線程的權(quán)限,當(dāng)這個(gè)收?qǐng)?zhí)令牌的線程在執(zhí)行的過(guò)程中,如果有其他線程想要開(kāi)啟,都會(huì)被拒絕,知道當(dāng)前執(zhí)行線程結(jié)束,釋放令牌,其他線程才可以開(kāi)啟。
因?yàn)槭亲约鹤聊サ姆椒?#xff0c;簡(jiǎn)單的寫了個(gè)demo,如果有大牛發(fā)現(xiàn)demo中有不足之處 ,歡迎指出,謝謝。
demo如下:
1 static Thread tokenThread = null;//線程令牌 2 static int i = 0;//控制廣播結(jié)束 3 public static void Greating() 4 { 5 6 Thread th = new Thread(() => 7 { 8 i = 0; 9 while (i++<5)//廣播數(shù)據(jù)5次后結(jié)束 10 { 11 Console.WriteLine("我是廣播線程{0},我開(kāi)始廣播啦!", Thread.CurrentThread.ManagedThreadId); 12 Thread.Sleep(1000); 13 } 14 Console.WriteLine("我不播啦!"); 15 tokenThread = null; 16 }); 17 if(tokenThread==null) //如果令牌沒(méi)人使用,則賦給該線程,否則跳過(guò)該線程 18 { 19 tokenThread = th; 20 th.Start(); 21 } 22 23 } View Code首先定義一個(gè)全程線程令牌,給其賦值為NULL,然后寫了個(gè)Greeting()函數(shù),在函數(shù)中開(kāi)了個(gè)廣播線程,廣播5次,用時(shí)5秒,廣播結(jié)束時(shí),把令牌釋放,重新賦為NULL,在啟動(dòng)線程時(shí)加了個(gè)if(tokenThread==null)的判斷,如果令牌處于釋放狀態(tài),則當(dāng)前線程獲得令牌,啟動(dòng)線程,執(zhí)行廣播5次,否則跳過(guò),相當(dāng)于本次Greeting()函數(shù)什么都沒(méi)執(zhí)行。
main函數(shù)很簡(jiǎn)單,只是開(kāi)了個(gè)while循環(huán),在里面沒(méi)1秒掉用一次Greeting()函數(shù)
1 static void Main(string[] args) 2 { 3 while (true) 4 { 5 Greating(); 6 Thread.Sleep(1000); 7 } 8 9 } View Code如果沒(méi)有令牌控制的話,沒(méi)秒都會(huì)開(kāi)一個(gè)廣播線程。
最終顯示結(jié)果如下,廣播5次后會(huì)開(kāi)新線程廣播:
?
轉(zhuǎn)載于:https://www.cnblogs.com/gongheng/p/5744503.html
總結(jié)
- 上一篇: EditText显示明文与密码
- 下一篇: HDU - 1875 畅通工程再续