我試圖用谷歌Guava建立一個緩存,並且想要對已過期的對象進行一些計算。如果某個對象被刪除,removeListener會通知我。如何在不同的線程中運行監聽器或在不同的線程中執行計算
如何在不同於主應用程序的線程中運行removeListener,或將處理計算的過期對象(在下面的簡單示例中,將爲整數3)傳遞給另一個線程?由於計算時間很短,但經常發生,所以我寧願不要每次都創建一個新的線程(將會有數千個線程),而是有一個(或者兩個)計算所有對象。
簡單的例子:
Cache<String, Integer> cache = CacheBuilder.newBuilder().maximumSize(100)
.expireAfterAccess(100, TimeUnit.NANOSECONDS)
.removalListener(new RemovalListener<String, Integer>() {
public void onRemoval(final RemovalNotification notification) {
if (notification.getCause() == RemovalCause.EXPIRED) {
System.out.println("removed " + notification.getValue());
// do calculation=> this should be in another thread
}
}
})
.build();
cache.put("test1", 3);
cache.cleanUp();
+1不錯的一個。非常優雅,屬於有問題的圖書館。 「只需加水」(或執行者服務) – maasg 2012-07-27 15:03:27
+1。不知道這個。它消除了創建Runnable實例的樣板代碼。如果只有一些清除必須在單獨的線程中完成(而不僅僅是由過期引起的清除),但它不起作用。 – 2012-07-27 17:28:46
:o我如何知道執行者傳遞給構造函數?我正在嘗試這樣的: CacheBuilder.newBuilder()。removalListener(new RemovalListener(){... – 2016-09-29 12:43:57