Java并发,在父线程中设置标志

Java并发,在父线程中设置标志,java,concurrency,Java,Concurrency,这是一个我曾多次面临的两难境地,我想不出一个干净的解决方案。假设Class1保持循环并生成工作线程。我希望线程能够在Class1中设置一个标志来执行特定的任务。我一直在做的是在Class1中有一个静态AtomicBoolean(标志)和一个公共静态方法来设置标志。但是,这会阻止我拥有多个Class1实例。将标志设置为类变量,然后为工作线程提供一个接口来设置和检查变量 class Owner implements FlagAccess { private AtomicBoolean _flag

这是一个我曾多次面临的两难境地,我想不出一个干净的解决方案。假设Class1保持循环并生成工作线程。我希望线程能够在Class1中设置一个标志来执行特定的任务。我一直在做的是在Class1中有一个静态AtomicBoolean(标志)和一个公共静态方法来设置标志。但是,这会阻止我拥有多个Class1实例。

将标志设置为类变量,然后为工作线程提供一个接口来设置和检查变量

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,一个工作线程,一个不相关的类?谁检查标志-工作线程?当他们看到设置了标志-清除标志并执行任务时,他们会做什么?是否存在工作线程无法执行工作的任何原因?为什么需要将工作传递回启动任务的线程?