現在我該如何處理在入口等待呢?我似乎無法找到一種方法來檢查線程池是否「滿」或類似的東西。
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)
但是沒有一個沒有自己編寫它的阻塞集。
您是否必須爲此場景使用線程?如果沒有看看隊列。 https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html –
是的,線程和線程池都是必需的。正如我所看到的,即使我在入口處使用了隊列,他們仍然會提交給執行者並建立另一個隊列。 – svennebanan
有一個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) –