Inhaltsverzeichnis
Was sind die vier vordefinierten Thread-Pools in Java?
Was sind die Unterschiede zwischen den vier Thread-Pools?
如何自定义线程池
Heim Java javaLernprogramm Welche vier Thread-Pools gibt es in Java?

Welche vier Thread-Pools gibt es in Java?

Apr 24, 2023 pm 07:52 PM
java

Was sind die vier vordefinierten Thread-Pools in Java?

  • newSingleThreadExexcutor: Thread-Pool mit einzelner Thread-Nummer (Anzahl der Kern-Threads = maximale Anzahl von Threads = 1)

  • newFixedThreadPool: Thread-Pool mit fester Anzahl von Threads (Anzahl der Kern-Threads = maximale Anzahl von Threads = benutzerdefiniert )

  • newCacheThreadPool: Cachebarer Thread-Pool (Anzahl der Kernthreads = 0, maximale Anzahl der Threads = Integer.MAX_VALUE)

  • newScheduledThreadPool: Thread-Pool, der geplante oder periodische Aufgaben unterstützt (Anzahl der Kernthreads = benutzerdefiniert, maximal Anzahl der Threads = Ganzzahl .MAX_VALUE)

Was sind die Unterschiede zwischen den vier Thread-Pools?

Die oben genannten vier Thread-Pool-Klassen erben alle ThreadPoolExecutor und geben beim Erstellen direkt neue ThreadPoolExecutor (Parameter) zurück. Der Unterschied zwischen ihnen besteht darin, dass die Parameter im definierten ThreadPoolExecutor (Parameter) unterschiedlich sind und ThreadPoolExecutor die ExecutorService-Schnittstellenklasse erbt

NeufixedThreadpool
  • Definition:
XecutorService ExecutorService = Executors.NewFixedThreadpool (2); ist leicht zu sammeln und scheitern. aber da ist Der Unterschied besteht darin, dass es eine weitere Ebene gibt FinalizableDelegatedExecutorService, seine Funktion:


Es ist ersichtlich, dass die Essenz von FixedExecutorService ThreadPoolExecutor ist, sodass FixedExecutorService zu ThreadPoolExecutor gezwungen werden kann, SingleExecutorService jedoch nichts mit ThreadPoolExecutor zu tun hat Daher schlägt die erzwungene Übertragung fehl, sodass newSingleThreadExecutor() Nach der Erstellung kann es nicht mehr geändert werden. Ändern Sie die Thread-Pool-Parameter, um wirklich einen einzelnen Thread zu erreichen.

Welche vier Thread-Pools gibt es in Java?Nachteile: Die Blockierungswarteschlange für verknüpfte Listen von LinkBlockQueue wird verwendet. Wenn die Akkumulationsgeschwindigkeit von Aufgaben höher ist als die Verarbeitungsgeschwindigkeit, kann es leicht zu einer Akkumulation von Aufgaben und einem OOM-Speicherüberlauf kommen.

newCacheThreadPool

  • Definition: ExecutorService ();

Nachteile: SynchronousQueue ist eine Implementierung von BlockingQueue. Es handelt sich auch um eine Warteschlange, da die maximale Anzahl von Threads Integer.MAX_VALUE beträgt. Wenn also zu viele Threads vorhanden sind, kann es leicht zu einem OOM-Speicherüberlauf kommen

ScheduledThreadPool

Welche vier Thread-Pools gibt es in Java?

Definition: ExecutorService executorService=Executors.

源码:
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        //ScheduledThreadPoolExecutor继承ThreadPoolExecutor
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }
    
public ScheduledThreadPoolExecutor(int corePoolSize) {
    //ScheduledThreadPoolExecutor继承ThreadPoolExecutor,故super()会调用ThreadPoolExecutor的构造函数初始化并返回一个ThreadPoolExecutor,而ThreadPoolExecutor使实现ExecutorService接口的
    //最终ScheduledThreadPoolExecutor也和上面几种线程池一样返回的是ExecutorService接口的实现类ThreadPoolExecutor
    super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
          new DelayedWorkQueue());
}
Nach dem Login kopieren

Was sind die wichtigen Parameter des Thread-Pools? Die Konstruktionsmethode von Welche vier Thread-Pools gibt es in Java?

ThreadPoolExecutor lautet wie folgt:

keepAliveTime bezieht sich darauf, wie lange diese Nicht-Kern-Threads ohne Arbeit auf Leerlaufzeit warten, wenn die aktuelle Anzahl von Threads zwischen [Anzahl der Kern-Threads, maximal Anzahl der Threads], Verlassen Sie einfach den Thread-Pool;

Welche vier Thread-Pools gibt es in Java?

Die Größe der Warteschlange hat nichts mit der maximalen Anzahl von Threads zu tun. Thread-Erstellungspriorität = Kern-Threads > Blockierungswarteschlange > erweiterte Threads (wenn die aktuelle Anzahl von Kern-Threads sind kleiner als die maximale Anzahl von Threads, um Threads zu erweitern)

Wenn die Anzahl der Kern-Threads 5 beträgt, beträgt die Länge der Warteschlange 3 und die maximale Anzahl von Threads beträgt 10: Wenn die Anzahl der Threads weiterhin anhält Erhöhen Sie, erstellen Sie zuerst 5 Kernthreads und werfen Sie dann die Threads hinein. Warten Sie, bis die Warteschlange verloren geht, und warten Sie, bis die Warteschlange voll ist (3 Threads). Zu diesem Zeitpunkt wird die maximale Anzahl von Threads verglichen (nur wenn das Maximum erreicht ist). Die Anzahl der Threads, die auf den Verlust der Warteschlange warten müssen, kann angezeigt werden. Sie können weiterhin 2 Threads erstellen (5+3+2). Wenn die Anzahl der Threads die maximale Anzahl von Threads überschreitet, wird die Ablehnungsrichtlinie ausgeführt

Wenn die Anzahl der Kernthreads 5 beträgt, beträgt die Warteschlangenlänge 3 und die maximale Anzahl der Threads beträgt 7: Wenn die Anzahl der Threads weiter zunimmt, erstellen Sie zuerst 5 Kernthreads Wenn die Warteschlange voll ist, werden Threads in die Warteschlange geworfen. Wenn sich 2 Threads in der Warteschlange befinden, ist die maximale Anzahl an Threads erreicht (5+2=7), die Warteschlange ist jedoch noch nicht voll, sodass dies nicht erforderlich ist Sorgen Sie sich um die maximale Anzahl von Threads, bis die Warteschlange voll ist (3 blockierte Threads). Zu diesem Zeitpunkt wird die maximale Anzahl von Threads verglichen (nur wenn die Warteschlange voll ist und die maximale Anzahl von Threads beendet werden kann). + Warteschlange = 5+3=8>7= Die maximale Anzahl an Threads, d. h. die maximale Anzahl an Threads wurde erreicht, dann wird die Ablehnungsrichtlinie ausgeführt

Wenn die Warteschlange auf LinkedBlockingQueue eingestellt ist Unbegrenzte Warteschlange, diese Warteschlange ist unendlich und wird niemals die maximale Thread-Bestimmung erreichen. Zählen Sie diesen Schritt

如何自定义线程池

可以使用有界队列,自定义线程创建工厂ThreadFactory和拒绝策略handler来自定义线程池

public class ThreadTest {
    public static void main(String[] args) throws InterruptedException, IOException {
        int corePoolSize = 2;
        int maximumPoolSize = 4;
        long keepAliveTime = 10;
        TimeUnit unit = TimeUnit.SECONDS;
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(2);
        ThreadFactory threadFactory = new NameTreadFactory();
        RejectedExecutionHandler handler = new MyIgnorePolicy();
       ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit,
                workQueue, threadFactory, handler);
        executor.prestartAllCoreThreads(); // 预启动所有核心线程        
        for (int i = 1; i <= 10; i++) {
            MyTask task = new MyTask(String.valueOf(i));
            executor.execute(task);
        }
        System.in.read(); //阻塞主线程
    }
    static class NameTreadFactory implements ThreadFactory {
        private final AtomicInteger mThreadNum = new AtomicInteger(1);
        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r, "my-thread-" + mThreadNum.getAndIncrement());
            System.out.println(t.getName() + " has been created");
            return t;
        }
    }

    public static class MyIgnorePolicy implements RejectedExecutionHandler {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            doLog(r, e);
        }
        private void doLog(Runnable r, ThreadPoolExecutor e) {
            // 可做日志记录等
            System.err.println( r.toString() + " rejected");
//          System.out.println("completedTaskCount: " + e.getCompletedTaskCount());
        }
    }

    static class MyTask implements Runnable {
        private String name;
        public MyTask(String name) {
            this.name = name;
        }
        @Override
        public void run() {
            try {
                System.out.println(this.toString() + " is running!");
                Thread.sleep(3000); //让任务执行慢点
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        public String getName() {
            return name;
        }
        @Override
        public String toString() {
            return "MyTask [name=" + name + "]";
        }
    }
}
Nach dem Login kopieren

运行结果:

Welche vier Thread-Pools gibt es in Java?

其中7-10号线程被拒绝策略拒绝了,1、2号线程执行完后,3、6号线程进入核心线程池执行,此时4、5号线程在任务队列等待执行,3、6线程执行完再通知4、5线程执行

Das obige ist der detaillierte Inhalt vonWelche vier Thread-Pools gibt es in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.

See all articles