2 回答

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都行。

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方法
添加回答
舉報(bào)