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

时间:2011-02-07 15:35:10

标签: java concurrency

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

4 个答案:

答案 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框架进行启动和线程管理。

Code examples etc. here - Java Concurrency In Practice