亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

檢測java線程開始等待并運行一些代碼

檢測java線程開始等待并運行一些代碼

青春有我 2021-11-24 16:11:10
有沒有辦法放置任何類型的事件偵聽器,當某個線程(例如當前線程)停止其活動并開始等待或終止時將調用該偵聽器?我需要這個來通知對象并釋放一些資源,當它在這個線程中沒有被積極使用但仍然存儲在內存中的某個地方以防止它被垃圾收集時 - 否則我會將該資源釋放代碼放在 finalise( ) 方法。UPD 用例:保持對 jdbc 結果集或數據庫連接的引用的對象;當對象暫時擱置或完全丟棄時,應自動調用相應的 close() 或 commit(),而無需程序調用任何類型的清理方法。(毫無疑問,我如何鎖定一次只能從一個線程訪問的對象,已解決。)
查看完整描述

2 回答

?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

明顯的非答案:錯誤的設計點。線程不“擁有”資源。

線程只是“執行線程”。他們運行你告訴他們運行的代碼。因此,一個線程不擁有它來的任何對象。

因此,沒有內置機制可以幫助滿足您的要求。您必須自己實現一些東西,依賴于監控線程及其狀態。這將是一項艱巨且具有挑戰性的任務。主要是因為:多線程很難。

這里的嚴肅建議:從這個設計退后一步。而是考慮其他不同的方式來處理此類“資源”。


查看完整回答
反對 回復 2021-11-24
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

這確實是一種錯誤的做法。顯然,您可以像這樣在 finally 塊中鎖定對象并解鎖它:


private Lock lock = new ReentrantLock();


public void useObject() {

    lock.lock();

    try {

        //do something with your resource.

    }

    finally {

        lock.unlock();

    }

}

這樣,如果運行 useObject 的線程終止,它將執行 finally 塊,并解鎖保護資源的鎖。


但是沒有辦法檢測線程沒有任何活動。如果線程被操作系統搶占,您將無從得知。那是在抽象層之下,你作為開發者,在操作。


如果您想更多地了解操作系統如何與線程一起工作,以及您不能做什么,您應該查看


Java 多線程、并發和性能優化


Udemy 上的課程。它還討論了如何正確使用正確的鎖來進行這種安全同步,并在您必須共享數據庫連接等資源時從應用程序中獲得最佳性能。


我希望它有幫助


查看完整回答
反對 回復 2021-11-24
  • 2 回答
  • 0 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號