我有一個由 ThreadPoolExecutor.execute 創建的可運行檔案
例如:
class myObj implements Runnable{{
int m_id;
myObj(int id) {n_id = id}
@Override
public void run() { }
}
m_threadPoolTaskExecutor.execute(
new myObj(9);
);
然后在運行之后,如何從該執行緒獲取 myObj 實體?那么我可以遍歷執行緒池并找到與 m_id == 9 匹配的 mObj 嗎?
uj5u.com熱心網友回復:
執行緒是可運行的,但并非所有可運行的都是執行緒。當您將 Runnable 提交到執行緒池時,期望池提供實際執行緒,您的 Runnable 只是一個旨在由某個執行緒執行的任務。當分配給您的任務的執行緒池作業程式完成處理它時,它會抓取另一個任務并且它不再具有您的 Runnable。
您可以保留對 Runnable 的參考,但是您必須處理跨執行緒進行的更新,我們必須處理使用 volatile、AtomicInteger 或其他任何東西。您的代碼不僅會自動看到另一個執行緒所做的更改,JVM 還需要它尋找的特定跡象。將 runnable 提交到 pool,然后再查看 runnable 的整個模型非常丑陋且容易出錯。
如果您將 Runnable 更改為 Callable 并讓它使用 Future 回傳您需要的 int,那么將為您處理記憶體可見性問題。
將 Callable 傳遞給回傳 Future 的 ExecutorService 提交方法。您可以在 Future 上呼叫 isDone 以查看任務是否已完成,然后對其呼叫 get 以檢索從 Callable 回傳的值。
我不清楚在任務執行后你想在任務中找到什么。我的建議是使用您想要的值創建一個單獨的不可變物件。這里我稱它為 MyResult。所以 Callable 看起來像這樣:
class MyObj implements Callable<MyResult> {{
int m_id;
MyObj(int id) {n_id = id}
@Override
public MyResult call() {
return new MyResult(1,2);
}
}
class MyResult {
final val1;
final val2;
public MyResult(int val1, int val2) {
this.val1 = val1;
this.val2 = val2;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/442903.html
