2016-12-15 2 views
1

So ist dies das Szenario, das ich mit einer Lösung zu kommen versuchen für:Prüfen, ob ein Threadpool Aufgaben hat, die auf Ausführung warten?

Sie mit 2000 freien Slots ein Parkhaus bekam. Es hat 4 Eingänge. Wenn das Parkhaus voll ist, dürfen an jedem Eingang nur 50 Autos warten.

Was ich getan habe, war ein Thread-Pool mit 2000 Threads erstellen, und dann 4 Threads, die die Eingänge darstellen. In zufälligen Intervallen erstellen sie Auto Tasks (sie rufen im Grunde nur Thread.sleep()) und übergibt sie an den Thread-Pool.

Das Problem entsteht, wenn der Thread-Pool besetzt ist 2000 Aufgaben ausführt und neu eingereichte Aufgaben werden in einer Warteschlange gestellt Ausführung abzuwarten. Wie gehe ich stattdessen mit dem Warten in den Eingängen um? Ich kann keinen Weg finden, um zu überprüfen, ob der Thread-Pool "voll" oder ähnlich ist. Oder vielleicht ist mein Ansatz völlig falsch.

+0

Haben Sie Threading für dieses Szenario verwenden? Wenn nicht, schauen Sie sich Queues an. https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html –

+0

Ja, beide Threads und Thread erforderlich. Wie ich es sehe, selbst wenn ich Warteschlangen in den Eingängen verwenden würde, würden sie sich immer noch dem Executor unterordnen und eine weitere Warteschlange aufbauen. – svennebanan

+0

Es gibt einen ThreadPoolExecutor-Konstruktor, der eine BlockingQueue zusammen mit einem RejectedExecutionHandler akzeptiert. Das sieht vielversprechend aus, um diese nette Herausforderung zu lösen. Ich denke, du musst ein bisschen mehr programmieren, um die 4 Eingänge zu repräsentieren. 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) –

Antwort

0

Wie gehe ich nun mit dem Warten in den Eingängen um? Ich kann keinen Weg finden, um zu überprüfen, ob der Threadpool "voll" ist oder ähnliches.

Hrm. Es gibt viele Möglichkeiten, dies mit den Java-Concurrent-Klassen zu tun. Ein Weg wäre, eine BlockingQueue mit einer begrenzten Größe von 2000 zu haben, die Parkplätze Schlitze darstellen würde. Dann haben Sie 4 Singlethread-Executor-Service-Thread-Pools mit jeweils einer Warteschlange von 50, die die 4 Eingänge darstellen. Sobald das 51. Auto versucht, an einem Eingang anzustehen, wird die RejectedExecutionException geworfen.

Etwas wie:

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); 

Sie benötigen einen pro Eingang Schlange und pro Eingang Threads gleichzeitig Parkplatz zu tun. Sie könnten entranceX.setRejectedExecutionHandler(...) anrufen, um einen Handler zu setzen, wenn ein Eingang voll war, wenn Sie nicht möchten, dass eine Ausnahme ausgelöst wird.

Die Sache, die ich nicht über diese Implementierung mag, ist, dass die parkingLot.remove(...)O(N) ist, aber es gibt kein Blockierungsset, ohne es selbst zu schreiben.

Verwandte Themen