Heim  >  Artikel  >  Java  >  Wie optimiert man den Java-Thread-Pool?

Wie optimiert man den Java-Thread-Pool?

PHPz
PHPznach vorne
2023-05-09 19:31:05796Durchsuche

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("线程池参数不合法");
        }
    }

Thread-Pool-Ablehnungsstrategie

Strategieschnittstelle: MyRejectedExecutionHandle

package com.springframework.concurrent;

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

    void rejectedExecution(Runnable runnable,MyThreadPoolExecutor threadPoolExecutor);

}
# ?? 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();
            }
        }
    }

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);
    }

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;
        }
    }
#🎜🎜 # 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();

}

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);
    }

}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen