2011-02-07 34 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); 
}