2011-02-07 32 views
0

這是一個我遇到過幾次的困境,我想不出一個乾淨的解決方案。假設有Class1繼續循環併產生工作線程。我希望這些線程能夠在Class1中設置一個標誌來執行某個任務。我一直在做的是在Class1中設置靜態AtomicBoolean(標誌)和公共靜態方法來設置標誌。但是,這阻止了我擁有多個Class1實例。Java併發性,在父線程中設置標誌

+0

這將有助於瞭解更多關於正在做的事情。 Unholysampler的答案可能是適當的,但是..誰設置了標誌 - Class1,一個工作者線程,一個不相關的類?誰檢查標誌 - 工人線程?他們在看到標誌設置時做了什麼 - 清除標誌並執行任務? – 2011-02-07 15:45:24

+0

工作者線程是否有任何理由不能完成這項工作?爲什麼你需要將工作傳回開始任務的線程? – 2011-02-07 17:40:42

回答

4

使標誌成爲類變量,然後爲工作線程提供一個接口來設置和檢查變量。

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); 
    } 
} 
+0

你在這裏擊敗我。但是,我想說明的是,由於他正在使用原子布爾值,所以不需要同步。 – 2011-02-07 15:40:59

+0

添加示例代碼。 @Sergey Tachenov:注意到了,所以我刪除了該評論。 – unholysampler 2011-02-07 15:45:50

0

將Class1的實例傳遞給線程怎麼樣?所以他們可以調用class1.doStuff()。不要忘記同步doStuff()

1

簡單的答案似乎是在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); 
}