這是一個我遇到過幾次的困境,我想不出一個乾淨的解決方案。假設有Class1繼續循環併產生工作線程。我希望這些線程能夠在Class1中設置一個標誌來執行某個任務。我一直在做的是在Class1中設置靜態AtomicBoolean(標誌)和公共靜態方法來設置標誌。但是,這阻止了我擁有多個Class1實例。Java併發性,在父線程中設置標誌
回答
使標誌成爲類變量,然後爲工作線程提供一個接口來設置和檢查變量。
class Owner implements FlagAccess {
private AtomicBoolean _flag;
public boolean getFlag() {
return _flag.get();
}
public void setFlag(boolean value) {
return _flag.set(value);
}
}
interface FlagAccess {
public boolean getFlag();
public void setFlag(boolean value);
}
class Worker extends Thread {
private FlagAccess _access;
public Worker(FlagAccess access) {
_access = access;
}
public run() {
_access.get();
...
_access.set(true);
}
}
你在這裏擊敗我。但是,我想說明的是,由於他正在使用原子布爾值,所以不需要同步。 – 2011-02-07 15:40:59
添加示例代碼。 @Sergey Tachenov:注意到了,所以我刪除了該評論。 – unholysampler 2011-02-07 15:45:50
將Class1的實例傳遞給線程怎麼樣?所以他們可以調用class1.doStuff()。不要忘記同步doStuff()
簡單的答案似乎是在Class1中創建一個非靜態的AtomicBoolean,並將對Class1或其AtomicBoolean的引用傳遞給您的工作任務。
例如(注意,此代碼是在大多數方面相當可怕 - 它並不如使用線程管理一個ExecutorService)
class Class1 {
AtomicBoolean flag;
public void spawnTask (IndicatingTask task) {
task.setFlagVariable(flag);
new Thread(task).start();
}
}
interface IndicatingTask extends Runnable {
public void setFlagVariable(AtomicBoolean flag);
}
不是有一個標誌「1類」設置 - 它會爲工作線程恢復工作結果/狀態?如果是這樣的話,看看爲工人使用未來。使用Executor框架進行啓動和線程管理。
- 1. Java併發性,在父線程中訪問套接字
- 2. Java線程併發性
- 3. Java線程的併發性
- 4. Java併發性:標誌/事件
- 5. 性能比較:檢查並設置一個標誌VS.只需設置標誌
- 6. 線程併發性
- 7. JAVA線程併發
- 8. Java併發性線程錯誤
- 9. Java併發性問題線程vs executorservice
- 10. Java監視器和線程併發性
- 11. 在線程中獲取和設置標誌變量
- 12. Java線程不迴應我是新來的Java併發揮發性布爾標誌
- 13. 在Inno Setup中設置「RUNASADMIN」應用程序兼容性標誌
- 14. 設置在一類改性標誌
- 15. 在java中使用併發線程
- 16. 如何實現線程併發性在Java中
- 17. 什麼時候線程的中斷標誌被設置?
- 18. 如何在spring java配置中設置日誌記錄屬性?
- 19. java中的子線程塊父線程
- 20. 線程的併發性
- 21. Java併發喚醒線程
- 22. Java併發和多線程
- 23. 在多線程的併發設置中使用unixODBC
- 24. 如何從父屬性設置觸發設置子屬性
- 25. Java併發設置超時
- 26. 在java中設置屬性
- 27. C++設置「標誌」
- 28. 在助推線程中讀標誌
- 29. 多線程Python中設置_Thread屬性
- 30. 線程在屬性設置器
這將有助於瞭解更多關於正在做的事情。 Unholysampler的答案可能是適當的,但是..誰設置了標誌 - Class1,一個工作者線程,一個不相關的類?誰檢查標誌 - 工人線程?他們在看到標誌設置時做了什麼 - 清除標誌並執行任務? – 2011-02-07 15:45:24
工作者線程是否有任何理由不能完成這項工作?爲什麼你需要將工作傳回開始任務的線程? – 2011-02-07 17:40:42