Heim >Java >javaLernprogramm >Thread-Pool in Java

Thread-Pool in Java

WBOY
WBOYOriginal
2023-06-15 20:51:481414Durchsuche

In Java werden Thread-Pools verwendet, um Aufgaben wie die Erstellung, Wartung und Zerstörung von Threads zu verwalten. Der Thread-Pool enthält eine Gruppe von Threads und eine Aufgabenwarteschlange. Wenn eine Aufgabe ausgeführt werden muss, rufen die Threads im Thread-Pool die Aufgabe automatisch ab und führen sie aus Thread-Pool zur Wiederverwendung.

Die Thread-Pool-API in Java stellt eine Executors-Klasse bereit, die uns beim Erstellen eines Thread-Pools hilft, und stellt vier Thread-Pool-Implementierungsmethoden bereit: FixedThreadPool, CachedThreadPool, SingleThreadExecutor und ScheduledThreadPool.

FixedThreadPool

Ein Thread-Pool mit fester Größe. Nur wenn die Anzahl der Arbeits-Threads die Thread-Pool-Größe nicht erreicht, wird ein neuer Thread erstellt, um Aufgaben auszuführen. Der Thread-Pool kann die maximale Anzahl von Threads über den Konstruktor angeben. Wenn nicht angegeben, ist er standardmäßig Integer.MAX_VALUE.

Beispielcode:

ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
    executorService.execute(()->{
        System.out.println(Thread.currentThread().getName()+" is executing task ");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
}

Laufendes Ergebnis:

pool-1-thread-1 is executing task 
pool-1-thread-3 is executing task 
pool-1-thread-5 is executing task 
pool-1-thread-2 is executing task 
pool-1-thread-4 is executing task 
pool-1-thread-5 is executing task 
pool-1-thread-3 is executing task 
pool-1-thread-1 is executing task 
pool-1-thread-2 is executing task 
pool-1-thread-4 is executing task 

CachedThreadPool

Cachebarer Thread-Pool. Wenn die Anzahl der Threads die aktuell erforderliche Anzahl überschreitet, werden sie in den Thread-Pool zurückgeführt werden automatisch vernichtet. Wenn im Thread-Pool keine Threads verfügbar sind und eine neue Aufgabe eintrifft, erstellt der Thread-Pool einen neuen Thread, um die Aufgabe auszuführen, bis die Thread-Pool-Größe den Grenzwert von Integer.MAX_VALUE erreicht.

Beispielcode:

ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
    executorService.execute(()->{
        System.out.println(Thread.currentThread().getName()+" is executing task ");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
}

Ausführungsergebnisse:

pool-1-thread-1 is executing task 
pool-1-thread-2 is executing task 
pool-1-thread-3 is executing task 
pool-1-thread-4 is executing task 
pool-1-thread-5 is executing task 
pool-1-thread-6 is executing task 
pool-1-thread-7 is executing task 
pool-1-thread-8 is executing task 
pool-1-thread-9 is executing task 
pool-1-thread-10 is executing task 

SingleThreadExecutor

Ein Single-Thread-Thread-Pool mit nur einem Worker-Thread kann sicherstellen, dass alle Aufgaben in der angegebenen Reihenfolge (FIFO, LIFO, Priorität usw.) ausgeführt werden. , was einem speziellen FixedThreadPool entspricht.

Beispielcode:

ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
    executorService.execute(()->{
        System.out.println(Thread.currentThread().getName()+" is executing task ");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
}

Laufergebnisse:

pool-1-thread-1 is executing task 
pool-1-thread-1 is executing task 
pool-1-thread-1 is executing task
......

ScheduledThreadPool

Der geplante Thread-Pool kann Aufgaben gemäß der angegebenen Verzögerungszeit oder periodisch ausführen und geplante Aufgaben oder periodische Aufgaben implementieren. Die Größe des Thread-Pools kann angegeben werden. Wenn nicht angegeben, ist sie standardmäßig Integer.MAX_VALUE.

Beispielcode:

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
ScheduledFuture<?> future = scheduledExecutorService.schedule(()->{
    System.out.println(Thread.currentThread().getName()+" is executing delay task ");
}, 5, TimeUnit.SECONDS);
scheduledExecutorService.scheduleAtFixedRate(()->{
    System.out.println(Thread.currentThread().getName()+" is executing periodic task ");
}, 2, 3, TimeUnit.SECONDS);

Laufende Ergebnisse:

pool-1-thread-1 is executing periodic task 
pool-1-thread-2 is executing periodic task 
pool-1-thread-3 is executing periodic task 
pool-1-thread-1 is executing periodic task 
pool-1-thread-3 is executing periodic task 
pool-1-thread-2 is executing periodic task 
pool-1-thread-3 is executing periodic task 
pool-1-thread-2 is executing periodic task 
......
pool-1-thread-1 is executing delay task 

Zusammenfassung

Thread-Pool ist ein äußerst wichtiges Konzept in der Multithread-Entwicklung, das den Aufwand für die Thread-Erstellung, -Zerstörung und den Kontextwechsel effektiv reduzieren und die Systemleistung und Wartbarkeit verbessern kann . Java stellt die Executors-Klasse zum einfachen Erstellen von Thread-Pools bereit und bietet verschiedene Implementierungsmethoden für den Umgang mit unterschiedlichen Anwendungsszenarien. Wenn Entwickler Thread-Pools verwenden, müssen sie basierend auf den spezifischen Anforderungen und Lastbedingungen eine geeignete Implementierungsmethode auswählen, um die beste Leistung und die besten Effekte zu erzielen.

Das obige ist der detaillierte Inhalt vonThread-Pool in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn