您可以使用executor服務創建和終止線程,以及處理併發的CopyOnWriteArrayList。
private CopyOnWriteArrayList<someObject> someArrayList = new CopyOnWriteArrayList<someObject>();
...
class NodeStatusThread implements Runnable {
private ExecutorService UpdaterThreadExecutor = null;
private int numThrd = 20; //threads
private int timeout = 10; // ten-seconds
@Override
public void run() {
for (int i=0;i<numThrd; i++) {
UpdaterThreadExecutor.execute(new UpdaterThread());
}
UpdaterThreadExecutor.shutdown();
try{
//Wait for thread completion
if(!UpdaterThreadExecutor.awaitTermination(timeout, TimeUnit.SECONDS)){ //return false is timeout is surpassed
UpdaterThreadExecutor.shutdownNow(); //forces thread termination
}
}catch(InterruptedException e){
UpdaterThreadExecutor.shutdownNow();
}
}
}
...
class UpdaterThread implements Runnable {
@Override
public void run() {
omeArrayList.add(someObject);
someArrayList.remove(someObject);
}
}
這遠遠不夠。首先,你應該考慮如何在* t1之前管理併發訪問*。如果你有解決這個問題的辦法,另一個會自然而然地出現。 – Holger 2015-03-31 18:01:19
那麼,你是說我返回後,我不需要擔心,如果我更新它線程安全的方式(例如:作爲一個同步的方式?)。但我懷疑它。因爲API說:「迭代時用戶需要在返回列表上手動同步:」[ref:http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html #synchronizedList(java.util.List)] – namalfernandolk 2015-03-31 18:05:39
忘掉'synchronizedList'。如上所述,這是不夠的。您需要手動訪問控制。而且一旦你實現了某種手動控制,就很容易添加一個「我們超越t1」的條件,它會拒絕從updater線程訪問列表。解釋如何做到這一點太廣泛。通過閱讀API文檔,您無法學習併發編程;你首先需要了解基本原理。我推薦閱讀Brian Goetz,Joshua Bloch,Doug Lea等人撰寫的「Java Concurrency in Practice」。 – Holger 2015-03-31 18:15:59