这是我的情况。

我有一个频率池,我的BaseStation需要选择一个。 BaseStation的关键部分是进入频率选择的阶段。一旦选择了频率,控制就会返回到主BaseStation类,并恢复其请求生成。同时,即,一旦它离开其临界区,选定的频率将在一段时间内进入使用状态,这将由随机时钟决定。因此,此频率将无法用于此期间发生的任何其他请求。一旦频率使用时间结束,它就将其状态再次设置为可用。因此,BaseStation的互斥部分仅用于频率选择,一旦结束,BaseStation功能和频率使用时间就会并行运行。

到目前为止,我的编码方式是:我有三个类BaseStationCriticalSectionUseFrequencyBaseStation调用CriticalSection中的一个函数进行频率选择,一旦选择了频率,我就有一个函数启动另一个类中的线程以进行频率使用,然后在不久之后将控制权返回给BaseStation

UseFrequency freqInUse = new UseFrequency;
freqInUse.start();
return 1;


但是一旦线程停止,类CriticalSection需要更新一些变量,我很困惑如何将控制权返回给中级类。我需要使用两个线程吗?

最佳答案

我不确定您的问题是什么(所以我已经猜到了!),但是一个选择是包装Apache GenericObjectPool以存储您的Frequency对象,然后调用borrowObject()从中删除Frequency并指出它正在“使用中”。在调用borrowObject()时,您还可以安排任务(例如,使用ScheduledExecutorService)在将来的某个时间点调用returnObject(),从而使Frequency再次可用于其他线程。

public class FrequencyPool {
  private final GenericObjectPool objPool = ...
  private final ScheduledExecutorService timerService = ...
  private final Random random = new Random();

  public Frequency takeFrequency() {
    final Frequency freq = (Frequency) objPool.borrowObject(); // Will block

    // Return frequency to underlying object pool after a random time.
    timerService.schedule(new Callable<Void>{
      public Void call() {
        objPool.returnObject(freq);
      }
    }, random.nextInt(10), TimeUnit.SECONDS);

    return freq;
  }
}

07-26 04:20