2012-05-22 35 views
0

我有一個要求開始一個任務..現在有許多線程可以開始這項任務,這項任務通常需要4-5秒才能完成。如果此任務已由其他線程啓動,我想阻止該任務的啓動。 爲了實現這個要求,我想在某個線程啓動任務時,在另一個線程中啓動一個計時器或秒錶。現在,當定時器在配置的時間間隔後超時時,另一個線程可以啓動任務。 因此,在一個不同的線程中啓動一個計時器或秒錶,以查看是否已經達到了特定的時間是一個很好的解決方案?有沒有什麼好的選擇?關於秒錶或計時器或其他實用程序

+0

加入方法怎麼樣? – tibtof

回答

0

如果你正在嘗試在java中這樣做,那麼你可以考慮在JAVA上面向對象的方法使用一個同步塊。

所以,你想要確保的任務是一次由一個線程完成,然後在該類中創建一個類和一個同步方法,並確保所有線程共享同一個類的對象並調用此方法他們想要執行任務的方法。

對於實例

Class SyncTask{ 


synchronized void task1(){ 

//Perform your task here 


} 

} 

您的應用程序的生命週期中一旦創建該類的對象,然後在所有線程使用同一個對象,讓他們把這種方法要執行的任務。

在多線程同時調用此方法的情況下。 JVM會處理這個序列,如果一個線程已經執行了一個任務,其他人調用它將等待第一個線程完成。

以這種方式,您將確保只有線程在任何給定時間執行任務。

我希望這會有所幫助。

0

如果您想安排任務,選擇框架通常類似於Quartz。它應該允許你做你需要的和更多的東西。關於非運行併發任務的問題,我建議你看看this之前的SO帖子,它應該指向正確的方向。

1

如果我理解正確,這是一個壞主意。基本上,你假設你的工作永遠不會超過5秒鐘,所以如果手錶告訴你有些工作在不到5秒鐘前開始,那麼你將不會開始另一個工作。這是非常不可靠的。

而是創建某種標誌,您可以在作業開始時設置並在結束時取消設置。 AtomicBoolean非常適合:

private AtomicBoolean flag = new AtomicBoolean(); 

//... 

if(!flag.getAndSet(true)) { 
    try { 
     //do your work 
    } finally { 
     flag.set(false); 
    } 
} else { 
    //Already running 
} 

如果你想高就等待前一個而不是簡單地被丟棄,只是圍繞着你的任務與​​或使用一些不同的鎖定機制。

注意:如果您的工作是分佈式的,您將需要一個分佈式鎖定機制,如數據庫或

+0

我的任務是ping設備,如果設備不pinging,任務線程將在5秒鐘內超時。現在,我不想扼殺網絡以再次發送呼叫,以查看設備是否不pinging相反,我想在此設備的特定時間之後發送一個呼叫,以查看設備是否再次聯機。 –

+0

@ashishgupta_mca:如果兩個線程在1秒內嘗試ping設備,第二個請求會發生什麼?是否應該放棄,是否應該等到第一次完成時,是否應該在第一次開始後等待至少5秒鐘(每5秒吞吐量保持最大1次請求)?根據您的要求,我們可以建議非常不同的最佳解決方案 –

相關問題