2016-12-15 89 views
1

所以這是我想拿出一個解決方案的情景:檢查一個線程池是否有等待執行的任務?

你違章停車的房子2000免費插槽。它有4個入口。當停車場已滿時,每個入口處只允許等待50輛汽車。

我最終做的是用2000個線程創建一個線程池,然後用4個線程表示入口。隨機間隔,他們創建汽車Tasks(他們基本上只是調用Thread.sleep())並將它們提交給線程池。

當線程池忙於執行2000個任務時,問題就出現了,新提交的任務被放入隊列中等待執行。我如何處理在入口處等待?我似乎無法找到一種方法來檢查線程池是否「完整」或類似的東西。或者,也許我的做法是完全錯誤的。

+0

您是否必須爲此場景使用線程?如果沒有看看隊列。 https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html –

+0

是的,線程和線程池都是必需的。正如我所看到的,即使我在入口處使用了隊列,他們仍然會提交給執行者並建立另一個隊列。 – svennebanan

+0

有一個ThreadPoolExecutor構造函數,它接受一個BlockingQueue和一個RejectedExecutionHandler。這看起來很有希望解決這個不錯的挑戰。我想你必須做一些額外的編碼來代表4個入口。 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html#ThreadPoolExecutor(int,%20int,%20long,%20java.util.concurrent.TimeUnit,%20java。 util.concurrent.BlockingQueue,%20java.util.concurrent.ThreadFactory,%20java.util.concurrent.RejectedExecutionHandler) –

回答

0

現在我該如何處理在入口等待呢?我似乎無法找到一種方法來檢查線程池是否「滿」或類似的東西。

Hrm。有很多方法可以使用Java併發類來做到這一點。其中一種方法是將BlockingQueue限制爲2000的大小,代表停車位插槽。然後有4個單線程執行程序 - 服務線程池,每個線程池都有一個代表4個入口的50個隊列。一旦第51輛車試圖在入口排隊,RejectedExecutionException被拋出。

喜歡的東西:

final int NUM_SPACES_IN_LOT = 2000; 
final int ENTRANCE_QUEUE_SIZE = 50; 
final BlockingQueue<Car> parkingLot = new LinkedBlockingQueue<>(NUM_SPACES_IN_LOT); 
... 
ExecutorService entrance1 = new ThreadPoolExecutor(1, 1, 
    0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(ENTRANCE_QUEUE_SIZE)); 
ExecutorService entrance1 = new ThreadPoolExecutor(1, 1, 
    0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(ENTRANCE_QUEUE_SIZE)); 
ExecutorService entrance1 = new ThreadPoolExecutor(1, 1, 
    0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(ENTRANCE_QUEUE_SIZE)); 
ExecutorService entrance1 = new ThreadPoolExecutor(1, 1, 
    0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(ENTRANCE_QUEUE_SIZE)); 
... 
private class ParkCar implements Runnable { 
    private final Car car; 
    public ParkCar(Car car) { 
     this.car = car; 
    } 
    public run() { 
     parkingLot.put(car); 
    } 
} 
... 
Car car = new Car(); 
try { 
    entrance1.submit(new ParkCar(car)); 
} catch (RejectedExecutionException jee) { 
    // entrance is full 
} 
... 
// remove a car from the lot, warning this is O(N) 
parkingLot.remove(car); 

你需要每一個入口隊列,每個入口線程做並行停車。如果您不希望它引發異常,則可以調用entranceX.setRejectedExecutionHandler(...)來設置處理程序,如果入口已滿。

我不喜歡這個實現的東西是parkingLot.remove(...)O(N)但是沒有一個沒有自己編寫它的阻塞集。

相關問題