这是我的情况。
我有一个频率池,我的BaseStation
需要选择一个。 BaseStation
的关键部分是进入频率选择的阶段。一旦选择了频率,控制就会返回到主BaseStation
类,并恢复其请求生成。同时,即,一旦它离开其临界区,选定的频率将在一段时间内进入使用状态,这将由随机时钟决定。因此,此频率将无法用于此期间发生的任何其他请求。一旦频率使用时间结束,它就将其状态再次设置为可用。因此,BaseStation
的互斥部分仅用于频率选择,一旦结束,BaseStation
功能和频率使用时间就会并行运行。
到目前为止,我的编码方式是:我有三个类BaseStation
,CriticalSection
和UseFrequency
。 BaseStation
调用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;
}
}