2010-03-02 72 views
1

這是我的場景。使用線程編程的方法

我有一個頻率池,我的BaseStation需要選擇其中之一。 BaseStation的關鍵部分是進入頻率選擇階段。一旦它選擇了頻率,控制返回到主要的BaseStation類,並且它恢復其請求生成。與此同時,即一旦它離開它的臨界區,被選擇的頻率將在一段時間內進入使用狀態,這將由隨機時鐘決定。因此,此頻率將不可用於此期間發生的任何其他請求。一旦頻率使用時間結束,它會將其狀態重新設置爲可用狀態。所以BaseStation的互斥部分僅用於頻率選擇,一旦結束,BaseStation功能和頻率使用時間並行運行。

我到目前爲止的編碼是:我有三個類BaseStation,CriticalSectionUseFrequencyBaseStationCriticalSection調用一個函數的頻率選擇,一旦頻率選擇我有一個在其他類使用頻率啓動一個線程的功能,然後不久後返回控制BaseStation

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

但是一旦線程停止,類CriticalSection需要一些變量更新,我很困惑如何將控制返回到中產階級。我需要使用兩個線程嗎?

+0

和問題....? – 2010-03-02 18:19:52

+0

這是個問題嗎? – 2010-03-02 18:20:12

+0

IVE如何編碼它迄今爲: - 一旦頻率被選擇我有在另一個類中用於頻率使用啓動一個線程的功能,然後將控制返回到主程序: - UseFrequency freqInUse =新UseFrequency; freqInUse.start(); return 1; 但是,一旦線程停止,啓動線程的類需要一些變量更新,我很困惑如何將控制權還給中產階級。我需要使用兩個線程嗎? – 2010-03-02 18:21:07

回答

4

我不知道你的問題是什麼(所以我種猜到!),但其中一個方案是包裹在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; 
    } 
} 
1

保持一個頻率數組,以及頻率狀態的另一個數組,無論是使用還是未使用。您需要讀寫鎖來訪問頻率。一旦頻率開始被使用,頻率的狀態可以被設置爲使用,啓動一個定時器,該定時器觸發獲取寫入鎖定的改變,並且將頻率狀態改變回未被使用。

2

控制像這樣的事情的併發性最簡單的方法可能是ReadWriteLockReentrantReadWriteLock是實現)。在選擇頻率的過程中,您應該鎖定寫入鎖定,然後在完成時解鎖。正常使用只會獲得讀鎖。這提供了頻率選擇期間的相互排斥,但是在其他情況下同時使用。

可以用Semaphore構建一個更通用的解決方案,對一組資源進行更細粒度的控制。

0

爲您控制返回給調用臨界區級使用的Executor來執行你的thread.Eg:

塊引用 ExecutorService的執行=執行人。newSingleThreadExecutor();

Future<?> future = executor.submit(//submit frequency thread runnable object); 

    try { 
     future.get(); 
     //do critical section update 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    executor.shutdown();