这是一个我遇到过几次的困境,我想不出一个干净的解决方案。假设有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