2012-01-05 32 views
1

假設我有一個Runnable,它執行簡單的文件寫入操作,並且此Runnable與執行程序一起調用。Executor's Runnable中的變量

隨着執行人是一個單獨的線程的Executor類..

public void doThis() { 
    executor.execute(new Runnable() { 
     @Override 
     public void run() { 
      file.write(_data); 
     } 
    }); 
} 

確實的_data得到保存的時刻執行即時內容()被調用?這意味着一旦runnable被提交到隊列中,我可以繼續並更改_data,並且更改不會寫入文件中?

_data = something 
doThis(); 
_data = something else 

有沒有機會讓我做file.write(別的東西)?

回答

1

不對你的第一個和第二個問題,對你的第三個問題是的......如果執行程序運行的單個線程是與調用線程分離的線程,那麼這不是線程安全的操作。除非.execute()在與調用方相同的線程上執行,否則需要避免對_data進行更改,直到.write完成。

解決這個問題的常用方法是在傳遞給執行程序之前簡單地創建_data的副本。

+0

這個問題是我將對_data進行很多更改,並且希望立即在新的_data上調用execute()。在這種情況下,我猜我唯一的選擇是實現某種數據結構_data,以便execute()將始終與_data []。一起工作。 – 2012-01-06 04:52:07

+0

還有一個類似的問題發佈(http://stackoverflow.com/questions/8147015/executor-execute-jmm-guarantee),其中他們談論內存一致性以及如何「內存一致性的影響:提交Runnable對象到Executor發生 - 在其執行開始之前,可能在另一個線程中。「 我一直希望通過相同的邏輯,_data =在doThis()之前不會發生。然而,我不太確定「之前發生的線索中的行爲」是什麼意思。它仍然有可能嗎? – 2012-01-06 04:59:01