这是我面临的几次困境,我想不出一个干净的解决方案。假设Class1保持循环并生成工作线程。我希望线程能够在Class1中设置一个标志来执行某个任务。我一直在做的是在Class1中有一个静态AtomicBoolean(flag)和一个公共静态方法来设置标志。但是,这可以防止我有多个Class1实例。
答案 0 :(得分: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);
}
}
答案 1 :(得分:1)
简单的答案似乎是在Class1中创建一个非静态的AtomicBoolean,并将对Class1的引用或其AtomicBoolean传递给您的工作任务。
e.g。 (请注意,此代码在大多数方面相当糟糕 - 例如,它不使用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);
}
答案 2 :(得分:0)
如何将Class1的实例传递给您的线程?所以他们可以调用class1.doStuff()。不要忘记同步doStuff()
答案 3 :(得分:0)
而不是在'Class1'中设置标志 - 它是否适用于工作线程返回结果/状态?如果是这样,请查看为工作人员使用Future。使用Executor框架进行启动和线程管理。