Ich möchte einen BoundedExecutor machen, nur eine feste Anzahl Thread kann parallel ausgeführt werden. Wenn weitere Aufgaben hinzugefügt werden, blockiert der Executor, bis andere Threads abgeschlossen sind.der ExecutorService werfen RejectException mit SynchronousQueue
Hier ist der Executor ich in anderen Fragen gefunden.
public class BoundedExecutor extends ThreadPoolExecutor {
private final Logger logger = LogManager.getLogger(BoundedExecutor.class);
private final Semaphore semaphore;
public BoundedExecutor(int bound){
super(bound, bound, 0, TimeUnit.SECONDS, new SynchronousQueue<>());
this.semaphore = new Semaphore(bound);
}
@Override
public void execute(Runnable task) {
try {
semaphore.acquire();
super.execute(task);
} catch (InterruptedException e) {
logger.error("interruptedException while acquiring semaphore");
}
}
protected void afterExecute(final Runnable task, final Throwable t){
super.afterExecute(task, t);
semaphore.release();
}
}
und der Hauptcode
public static void main(String[] args) throws Exception {
Runnable task =() -> {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " complete.");
} catch (InterruptedException e) {
e.printStackTrace();
}
};
BoundedExecutor pool = new BoundedExecutor(1);
for(int i = 0; i < 10; i++){
pool.execute(task);
}
pool.shutdown();
}
Ich dachte, der Code einen einzelnen Thread gemacht und Aufgaben ausführen sequentiell, aber eigentlich, wenn die erste Aufgabe abgeschlossen, der Vollstrecker geworfen java.util.concurrent.RejectedExecutionException .
während ich unterzeichne, wird der semaphore.acquire() den Thread blockieren, bis die erste Aufgabe abgeschlossen ist und den Semaphor freigeben, was ist mit dem Code falsch?
Warum verwenden Sie einen Semaphore mit einem SynchronousQueue? Was versuchst du damit zu erreichen? –
Der Semaphor wird zum Blockieren des ThreadExecutors verwendet, wenn der Pool gefüllt wird. Die synchroneQueue wird verwendet, da ich die Aufgabe nicht in die Warteschlange stellen möchte, wenn der Pool voll ist. – iceshi
Also wird die Verwendung einer SynchronousQueue blockiert, wenn es keinen freien Thread gibt, um sie aufzunehmen. Was fügt der Semaphore hinzu? –