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.
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("线程池参数不合法"); } }
Strategieschnittstelle: MyRejectedExecutionHandle
package com.springframework.concurrent; /** * 自定义拒绝策略 * @author 游政杰 */ public interface MyRejectedExecutionHandle { void rejectedExecution(Runnable runnable,MyThreadPoolExecutor threadPoolExecutor); }
/** * 实现自定义拒绝策略 */ //抛异常策略(默认) 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(); } } }
protected final void reject(Runnable runnable){ this.handle.rejectedExecution(runnable, this); } protected final void reject(Runnable runnable,MyThreadPoolExecutor threadPoolExecutor){ this.handle.rejectedExecution(runnable, threadPoolExecutor); }
@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; } }
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(); }
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); } }
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!