第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Java 如何讓一個(gè)線程運(yùn)行特定的時(shí)間,然后優(yōu)雅的終止?

Java 如何讓一個(gè)線程運(yùn)行特定的時(shí)間,然后優(yōu)雅的終止?

www說 2018-10-11 17:24:09
有一個(gè)對象列表,按對象的過期時(shí)間戳升序排序,當(dāng)內(nèi)存快要不足時(shí),想觸發(fā)一個(gè)線程從頭遍歷列表,把列表前面過期的對象都釋放掉(對象的資源是被pool的,必須手動(dòng)release)列表不是線程安全的(因?yàn)槌绦蚱渌糠诌壿嫷脑?,這里使用線程安全的集合類并不能解決問題),工作線程和釋放資源的線程同時(shí)只能有一個(gè)操作對象列表我的想法是,如果釋放資源的線程在列表上操作太長時(shí)間,工作線程一直被阻塞,很長時(shí)間整個(gè)系統(tǒng)就不能提供服務(wù)了,所以我想限制每次釋放資源的線程的執(zhí)行時(shí)間,在給定的時(shí)間里能釋放多少對象就釋放多少(并且時(shí)間結(jié)束時(shí),是優(yōu)雅的結(jié)束釋放工作),然后工作線程繼續(xù)執(zhí)行請問如何實(shí)現(xiàn)我這個(gè)思路?如果同時(shí)只有一個(gè)線程訪問對象列表,是不是把釋放對象的工作放在工作線程中更好?怎么實(shí)現(xiàn)執(zhí)行特定的時(shí)間呢?希望能有更標(biāo)準(zhǔn)的思路
查看完整描述

2 回答

?
UYOU

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊

釋放是個(gè)輕量操作。如果你實(shí)在糾結(jié)阻塞時(shí)間我有個(gè)思路。
因?yàn)槟愕膶ο罅斜?假設(shè)叫ol)不是線程安全的,所以每次操作都會(huì)鎖住ol。
那可以單開一個(gè)守護(hù)線程輪詢jvm內(nèi)存,一旦內(nèi)存到達(dá)這個(gè)閥值就可以認(rèn)為快用光了,然后將一個(gè)全局變了標(biāo)記為true。
當(dāng)你的工作線程發(fā)現(xiàn)這個(gè)全局變量為true后,在保存新對象到ol前,將ol最前面的幾個(gè)對象(1個(gè)或2個(gè),不用多因?yàn)樵谳喸兙€程沒發(fā)現(xiàn)內(nèi)存回復(fù)前其他工作線程仍會(huì)釋放)釋放,然后保存新的。
那個(gè)輪詢內(nèi)存的守護(hù)線程發(fā)現(xiàn)內(nèi)存低于指定的閥值后在將全局變量設(shè)為false,這樣新的工作線程不會(huì)在有釋放操作。
這樣的話你完全沒有引入任何需要鎖ol的線程,你ol的阻塞率還是你原來的工作線程。由于輪詢內(nèi)存線程是守護(hù)線程你也不用操心優(yōu)雅的終止問題。

更新

突然發(fā)現(xiàn)你問的是如果讓線程運(yùn)行指定的時(shí)間。。。。
線程卡在while前記一下開始時(shí)間,你循環(huán)里根據(jù)開始時(shí)間計(jì)算耗時(shí),達(dá)到你指定的時(shí)候跳出或sleep都行。


查看完整回答
反對 回復(fù) 2018-10-14
?
BIG陽

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊

工作線程和釋放資源的線程同時(shí)只能有一個(gè)操作對象列表

這個(gè)前提決定了你必須使用synchronized塊對操作這個(gè)列表的邏輯做保護(hù),這個(gè)沒得說;
剩下的問題就是:如何讓回收線程操作列表的時(shí)間更短?

我的思路是這樣的:很簡單,你的回收線程在操作列表時(shí),只做一件事情:把該回收的對象移出列表,放到另一個(gè)地方去(比如另一個(gè)列表,"列表2")

僅僅是“移出”的話,這個(gè)操作是非??斓?,不知道你這個(gè)列表有多大,一般情況都能瞬間完成;

然后讓工作線程去操作列表,回收線程慢慢來處理"列表2"中的回收工作, 互不干擾;

如果你的對象列表確實(shí)很極端地大,那么你可以將回收線程設(shè)計(jì)成"主-次"線程2層結(jié)構(gòu),其中主線程開啟子線程對列表做移出操作,并持有子線程對象的應(yīng)用;
而子線程,實(shí)現(xiàn)了interrupt方法,在方法中拋出一個(gè)你自定義的exception;

主線程在啟動(dòng)子線程后,sleep(你認(rèn)為合適的時(shí)間),醒來時(shí)若發(fā)現(xiàn)子線程還未結(jié)束,就調(diào)用子線程的interrupt方法


查看完整回答
反對 回復(fù) 2018-10-14
  • 2 回答
  • 0 關(guān)注
  • 4037 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號