Heim > Java > javaLernprogramm > Hauptteil

Wie optimiert man den Java-Thread-Pool?

PHPz
Freigeben: 2023-05-09 19:31:05
nach vorne
797 Leute haben es durchsucht

Optimierung des aktualisierten Thread-Pools

1: 4 neue Ablehnungsstrategien wurden hinzugefügt. Dies sind: MyAbortPolicy, MyDiscardPolicy, MyDiscardOldestPolicy, MyCallerRunsPolicy

2: Optimieren Sie die Konstruktionsmethode des Thread-Pools MyThreadPoolExecutor, fügen Sie eine Parameterüberprüfung hinzu und verhindern Sie die zufällige Parameterübertragung.

3: Das ist die wichtigste Optimierung.

  • Entfernen Sie die Thread-Vorheizfunktion des Thread-Pools. Da das Thread-Vorheizen viel Speicher verbraucht, wird es immer ausgeführt, wenn wir den Thread-Pool nicht verwenden.

  • Im Gegenzug überprüft sie beim Aufrufen der Ausführungsmethode zum Hinzufügen einer Aufgabe die aktuelle Größe der Worker-Thread-Sammlung und vergleicht sie mit dem Wert von corePoolSize Erstellt es über new MyWorker(). Der Vorteil des Hinzufügens von Threads zum Thread-Pool besteht darin, dass es beim Erstellen des Thread-Pools keine Auswirkungen auf den aktuellen Speicher hat, wenn er verwendet wird erstellt und zur Wiederverwendung in den Thread-Pool gestellt.

Thread-Pool-Konstruktor

public MyThreadPoolExecutor(){
        this(5,new ArrayBlockingQueue<>(10), Executors.defaultThreadFactory(),defaultHandle);
    }
    public MyThreadPoolExecutor(int corePoolSize, BlockingQueue<Runnable> waitingQueue,ThreadFactory threadFactory) {
        this(corePoolSize,waitingQueue,threadFactory,defaultHandle);
    }
    public MyThreadPoolExecutor(int corePoolSize, BlockingQueue<Runnable> waitingQueue,ThreadFactory threadFactory,MyRejectedExecutionHandle handle) {
        this.workers=new HashSet<>(corePoolSize);
        if(corePoolSize>=0&&waitingQueue!=null&&threadFactory!=null&&handle!=null){
            this.corePoolSize=corePoolSize;
            this.waitingQueue=waitingQueue;
            this.threadFactory=threadFactory;
            this.handle=handle;
        }else {
            throw new NullPointerException("线程池参数不合法");
        }
    }
Nach dem Login kopieren

Thread-Pool-Ablehnungsstrategie

Strategieschnittstelle: MyRejectedExecutionHandle

package com.springframework.concurrent;

/**
 * 自定义拒绝策略
 * @author 游政杰
 */
public interface MyRejectedExecutionHandle {

    void rejectedExecution(Runnable runnable,MyThreadPoolExecutor threadPoolExecutor);

}
Nach dem Login kopieren
# ?? Der Thread-Pool Erst dann wird das Thread-Objekt erstellt.

Handgeschriebener Thread-Pool-Quellcode

MyExecutorService

/**
     * 实现自定义拒绝策略
     */
    //抛异常策略(默认)
    public static class MyAbortPolicy implements MyRejectedExecutionHandle{
        public MyAbortPolicy(){

        }
        @Override
        public void rejectedExecution(Runnable r, MyThreadPoolExecutor t) {
            throw new MyRejectedExecutionException("任务-> "+r.toString()+"被线程池-> "+t.toString()+" 拒绝");
        }
    }
    //默默丢弃策略
    public static class MyDiscardPolicy implements MyRejectedExecutionHandle{

        public MyDiscardPolicy() {
        }
        @Override
        public void rejectedExecution(Runnable runnable, MyThreadPoolExecutor threadPoolExecutor) {

        }
    }
    //丢弃掉最老的任务策略
    public static class MyDiscardOldestPolicy implements MyRejectedExecutionHandle{
        public MyDiscardOldestPolicy() {
        }
        @Override
        public void rejectedExecution(Runnable runnable, MyThreadPoolExecutor threadPoolExecutor) {
            if(!threadPoolExecutor.isShutdown()){ //如果线程池没被关闭
                threadPoolExecutor.getWaitingQueue().poll();//丢掉最老的任务,此时就有位置当新任务了
                threadPoolExecutor.execute(runnable); //把新任务加入到队列中
            }
        }
    }
    //由调用者调用策略
    public static class MyCallerRunsPolicy implements MyRejectedExecutionHandle{
        public MyCallerRunsPolicy(){

        }
        @Override
        public void rejectedExecution(Runnable runnable, MyThreadPoolExecutor threadPoolExecutor) {
            if(!threadPoolExecutor.isShutdown()){//判断线程池是否被关闭
                runnable.run();
            }
        }
    }
Nach dem Login kopieren

MyRejectedExecutionException

protected final void reject(Runnable runnable){
        this.handle.rejectedExecution(runnable, this);
    }

    protected final void reject(Runnable runnable,MyThreadPoolExecutor threadPoolExecutor){
        this.handle.rejectedExecution(runnable, threadPoolExecutor);
    }
Nach dem Login kopieren

MyRejectedExecutionHandle# 🎜 🎜#
@Override
    public boolean execute(Runnable runnable)
    {
        if (!this.waitingQueue.offer(runnable)) {
            this.reject(runnable);
            return false;
        }
        else {
            if(this.workers!=null&&this.workers.size()<corePoolSize){//这种情况才能添加线程
                MyWorker worker = new MyWorker(); //通过构造方法添加线程
            }
            return true;
        }
    }
Nach dem Login kopieren
#🎜🎜 # Kernklasse MyThreadPoolExecutor

package com.springframework.concurrent;

import java.util.concurrent.BlockingQueue;

/**
 * 自定义线程池业务接口
 * @author 游政杰
 */
public interface MyExecutorService {

    boolean execute(Runnable runnable);

    void shutdown();

    void shutdownNow();

    boolean isShutdown();

    BlockingQueue<Runnable> getWaitingQueue();

}
Nach dem Login kopieren

Thread-Pool-Testklasse

package com.springframework.concurrent;

/**
 * 自定义拒绝异常
 */
public class MyRejectedExecutionException extends RuntimeException {

    public MyRejectedExecutionException() {
    }
    public MyRejectedExecutionException(String message) {
        super(message);
    }

    public MyRejectedExecutionException(String message, Throwable cause) {
        super(message, cause);
    }

    public MyRejectedExecutionException(Throwable cause) {
        super(cause);
    }

}
Nach dem Login kopieren
Nun, die aktualisierte Version des Thread-Pools wurde bis zu diesem Punkt optimiert und eine vollständige Version wird möglicherweise später veröffentlicht zur kontinuierlichen Optimierung.

Das obige ist der detaillierte Inhalt vonWie optimiert man den Java-Thread-Pool?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage