检查线程池是否有等待执行的任务?

时间:2016-12-15 14:21:56

标签: java multithreading threadpool

所以这就是我试图找到解决方案的场景:

  

你有一个有2000个免费插槽的停车场。它有4个入口。当停车场已满时,每个入口只允许50辆车等待。

我最终做的是创建一个包含2000个线程的线程池,然后是4个表示入口的线程。他们以随机的间隔创建汽车Tasks(他们基本上只是调用Thread.sleep())并将它们提交给线程池。

当线程池忙于执行2000个任务时,会出现问题,并且新提交的任务将被放入队列中以等待执行。我如何处理在入口处等待?我似乎无法找到一种方法来检查线程池是否“满”或类似的东西。或许我的做法完全错了。

1 个答案:

答案 0 :(得分:0)

  

现在我如何处理在入口处等待?我似乎无法找到一种方法来检查线程池是否已满#34;或类似的东西。

槽糕。使用Java并发类有很多方法可以做到这一点。一种方法是拥有一个2000的有限大小的BlockingQueue代表停车位。然后有4个单线程执行器服务线程池,每个线程池的队列为50,代表4个入口。一旦第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),但没有自己编写的阻止集。