2016-01-23 26 views
1

我有螺紋x,我開始喜歡這樣的主題:重新啓動線程一旦裏面完成

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(); 
    exec.scheduleAtFixedRate(() -> { 

裏面x我有一個CyclicBarrier與其他10個線程:

final CyclicBarrier _threadGate = new CyclicBarrier(10); 
ArrayList<Thread> _threadList = new ArrayList<>(); 

然後我添加線程到列表

所以在線程準備好我開始他們,讓他們在同一時間開始(也差不多,循環需要時間,即使其0,01ms)是很重要的:

for (int i = 0; i < _threadList.size(); i++) { 
    _threadList.get(i).start(); 
} 

現在,x結束,主線程是這樣的:

}, 0, repeatTimer, TimeUnit.SECONDS); 

如果repeatTimer300這意味着它的10線5分鐘後重新開始。

10個線程完成的時間是UNKNOWN金額,但是它不到5分鐘。肯定在2到4分鐘之間。

我想實現

一旦10個線程完成,重啓X,但有5秒的延遲是什麼。
爲此,我一直在考慮將repeatTimer的值設置爲10個線程+ 5秒所經過的時間(我不知道如何去做,我不知道最後一個線程完成任務時),但這是正確的嗎?還是有另一種方法呢?

+0

您不能重新啓動Java線程。 – Raedwald

回答

1

我沒有看到在這裏有SchedulingExecutorService的必要性。您可以等到所有主題使用CountDownLatch完成作業。

這裏有一個簡單exapmple:

while (!stopped) { 
    CountDownLatch latch = new CountDownLatch(N); 
    // create and start your threads 
    latch.await(); // this method blocks until each Thread calls countDown() 
    // wait here 5 seconds if you want 
} 

遞減每個線程的最後一個動作的滑鎖:

public void run() { 
    _threadGate.await(); 
    // thread actions 
    latch.countDown(); 
} 
+0

它必須是一個線程,因爲我有更多的線程,我希望它在重新啓動之前等待幾秒鐘,而不使用thread.Sleep阻止其他線程 – Alpha2k

+0

@ Alpha2k沒有任何變化,您仍然可以在單獨運行提供的代碼線程,所以睡眠不會影響其他線程 – AdamSkywalker

相關問題