0

Ich habe eine Klasse mit zwei @ Scheduled-Methoden wie folgt.Thread-Garantie im Frühjahr @ Geplante Aufgaben

public class JobExecutor { 
    private static final DelayQueue<Job> JOB_QUEUE = new DelayQueue<>(); 

    @Scheduled 
    public void run() { 
     Job job = JOB_QUEUE.take(); 
    } 

    @Scheduled 
    public void fillQueue { 
     JOB_QUEUE.add(.....); 
    } 
} 

Ich verwende einen Threadpool mit 20 Threads. Jetzt verwende ich eine DelayQueue, die eine blockierende Warteschlange in der run Methode ist. Gibt es eine Möglichkeit, dass alle 20 Threads beim Lesen der Warteschlange hängen bleiben (wenn sie leer ist) und die Methode fillQueue niemals ausgeführt wird?

Antwort

0

Nein, denn DelayQueue null zurück, wenn es keine Elemente für die Umfrage

+0

Eigentlich mache ich eine Take(). Nicht Umfrage(). – falcon

0

sind Wenn Sie einen Blick in den Code gehabt haben. Wenn Sie den Scheduler-Pool von xml

<task:executor id="executor" pool-size="10"/> 

dann der Pool-Größe konfigurieren wird sich die corePoolSize der builded ScheduledThreadPoolExecutor

ThreadPoolTaskScheduler.createExecutor line 146: 
new ScheduledThreadPoolExecutor(poolSize, threadFactory, rejectedExecutionHandler); 

und die maximumPoolSizeInteger.MAX_VALUE sein!

Daher lautet die Antwort: NEIN, es ist nur eine Core-Pool-Größe und mehr Threads werden erstellt, wenn sie angefordert werden. Dein Code blockiert also nicht.