Java并发,在父线程中设置标志
这是一个我曾多次面临的两难境地,我想不出一个干净的解决方案。假设Class1保持循环并生成工作线程。我希望线程能够在Class1中设置一个标志来执行特定的任务。我一直在做的是在Class1中有一个静态AtomicBoolean(标志)和一个公共静态方法来设置标志。但是,这会阻止我拥有多个Class1实例。将标志设置为类变量,然后为工作线程提供一个接口来设置和检查变量Java并发,在父线程中设置标志,java,concurrency,Java,Concurrency,这是一个我曾多次面临的两难境地,我想不出一个干净的解决方案。假设Class1保持循环并生成工作线程。我希望线程能够在Class1中设置一个标志来执行特定的任务。我一直在做的是在Class1中有一个静态AtomicBoolean(标志)和一个公共静态方法来设置标志。但是,这会阻止我拥有多个Class1实例。将标志设置为类变量,然后为工作线程提供一个接口来设置和检查变量 class Owner implements FlagAccess { private AtomicBoolean _flag
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);
}
}
将该标志设为类变量,然后为工作线程提供一个接口来设置和检查该变量
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);
}
}
将Class1的实例传递给线程怎么样?所以他们可以调用class1.doStuff()。不要忘记同步doStuff()将Class1的实例传递给线程怎么样?所以他们可以调用class1.doStuff()。不要忘记同步doStuff()简单的答案似乎是在Class1中创建一个非静态AtomicBoolean,并将对Class1或其AtomicBoolean的引用传递给工作任务 e、 (请注意,这段代码在大多数方面都相当糟糕——例如,它不使用ExecutorService进行线程管理)
简单的答案似乎是在Class1中创建一个非静态的AtomicBoolean,并将对Class1或其AtomicBoolean的引用传递给工作任务 e、 (请注意,这段代码在大多数方面都相当糟糕——例如,它不使用ExecutorService进行线程管理)
与其在“Class1”中设置标志,工作线程返回结果/状态是否有效?如果是这样,请考虑为员工使用未来。使用Executor框架进行初始化和线程管理
与其在“Class1”中设置标志,工作线程返回结果/状态是否有效?如果是这样,请考虑为员工使用未来。使用Executor框架进行初始化和线程管理
你在这里打败了我。然而,我想指出的是,由于他使用的是原子布尔运算,所以不需要同步。添加了示例代码@谢尔盖·塔奇诺夫:注意到了,所以我删除了那个评论。你在这里打败了我。然而,我想指出的是,由于他使用的是原子布尔运算,所以不需要同步。添加了示例代码@Sergey Tachenov:注意到了,所以我删除了那个评论。向员工公开经理类不是很干净。提供一个接口更好。向工作人员公开manager类不是很干净。提供接口更好。传递对标志的引用比传递对类的引用更好。但是提供一个干净的接口就更好了,传递一个对标志的引用比传递一个类的引用要好。但是为它提供一个干净的界面就更好了。这将有助于了解更多正在做的事情。邪恶采样器的回答可能是恰当的,但是。。谁设置了标志-Class1,一个工作线程,一个不相关的类?谁检查标志-工作线程?当他们看到设置了标志-清除标志并执行任务时,他们会做什么?是否存在工作线程无法执行工作的任何原因?为什么需要将工作传递回启动任务的线程?了解更多有关正在执行的任务的信息会有所帮助。邪恶采样器的回答可能是恰当的,但是。。谁设置了标志-Class1,一个工作线程,一个不相关的类?谁检查标志-工作线程?当他们看到设置了标志-清除标志并执行任务时,他们会做什么?是否存在工作线程无法执行工作的任何原因?为什么需要将工作传递回启动任务的线程?