1:新增了4种拒绝策略。分别为:myabortpolicy、mydiscardpolicy、mydiscardoldestpolicy、mycallerrunspolicy
2:对线程池MyThreadPoolExecutor的构造方法进行优化,增加了参数校验,防止乱传参数现象。
3:这是最重要的一个优化。
移除线程池的线程预热功能。因为线程预热会极大的耗费内存,当我们不用线程池时也会一直在运行状态。
换来的是在调用execute方法添加任务时通过检查workers线程集合目前的大小与corePoolSize的值去比较,再通过new MyWorker()去创建添加线程到线程池,这样好处就是当我们创建线程池如果不使用的话则对当前内存没有一点影响,当使用了才会创建线程并放入线程池中进行复用。
立即学习“Java免费学习笔记(深入)”;
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("线程池参数不合法");
}
}策略接口:MyRejectedExecutionHandle
每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库--SQLite,本文介绍的就是如何为你的Android应用程序创建和操作SQLite数据库。 数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android使用SQLite数据库,它是一个开源的、支持多操作系统的SQL数据库,在许多领域广泛使用,如Mozilla FireFox就是使用SQLite来存储配置数据的,iPhon
0
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);
}
}package com.springframework.concurrent;
/**
* 自定义拒绝策略
* @author 游政杰
*/
public interface MyRejectedExecutionHandle {
void rejectedExecution(Runnable runnable,MyThreadPoolExecutor threadPoolExecutor);
}package com.springframework.concurrent;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 纯手撸线程池框架
* @author 游政杰
*/
public class MyThreadPoolExecutor implements MyExecutorService{
private static final AtomicInteger taskcount=new AtomicInteger(0);//执行任务次数
private static final AtomicInteger threadNumber=new AtomicInteger(0); //线程编号
private static volatile int corePoolSize; //核心线程数
private final HashSet<MyWorker> workers; //工作线程
private final BlockingQueue<Runnable> waitingQueue; //等待队列
private static final String THREADPOOL_NAME="MyThread-Pool-";//线程名称
private volatile boolean isRunning=true; //是否运行
private volatile boolean STOPNOW=false; //是否立刻停止
private volatile ThreadFactory threadFactory; //线程工厂
private static final MyRejectedExecutionHandle defaultHandle=new MyThreadPoolExecutor.MyAbortPolicy();//默认拒绝策略
private volatile MyRejectedExecutionHandle handle; //拒绝紫略
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("线程池参数不合法");
}
}
/**
* 实现自定义拒绝策略
*/
//抛异常策略(默认)
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();
}
}
}
//call拒绝方法
protected final void reject(Runnable runnable){
this.handle.rejectedExecution(runnable, this);
}
protected final void reject(Runnable runnable,MyThreadPoolExecutor threadPoolExecutor){
this.handle.rejectedExecution(runnable, threadPoolExecutor);
}
/**
* MyWorker就是我们每一个线程对象
*/
private final class MyWorker implements Runnable{
final Thread thread; //为每个MyWorker
MyWorker(){
Thread td = threadFactory.newThread(this);
td.setName(THREADPOOL_NAME+threadNumber.getAndIncrement());
this.thread=td;
this.thread.start();
workers.add(this);
}
//执行任务
@Override
public void run() {
//循环接收任务
while (true)
{
//循环退出条件:
//1:当isRunning为false并且waitingQueue的队列大小为0(也就是无任务了),会优雅的退出。
//2:当STOPNOW为true,则说明调用了shutdownNow方法进行暴力退出。
if((!isRunning&&waitingQueue.size()==0)||STOPNOW)
{
break;
}else {
//不断取任务,当任务!=null时则调用run方法处理任务
Runnable runnable = waitingQueue.poll();
if(runnable!=null){
runnable.run();
System.out.println("task==>"+taskcount.incrementAndGet());
}
}
}
}
}
//往线程池中放任务
@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;
}
}
//优雅的关闭
@Override
public void shutdown()
{
this.isRunning=false;
}
//暴力关闭
@Override
public void shutdownNow()
{
this.STOPNOW=true;
}
//判断线程池是否关闭
@Override
public boolean isShutdown() {
return !this.isRunning||STOPNOW;
}
//获取等待队列
@Override
public BlockingQueue<Runnable> getWaitingQueue() {
return this.waitingQueue;
}
}package com.springframework.test;
import com.springframework.concurrent.MyThreadPoolExecutor;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
public class ThreadPoolTest {
public static void main(String[] args) {
// MyThreadPoolExecutor myThreadPoolExecutor = new MyThreadPoolExecutor
// (5,new ArrayBlockingQueue<>(6), Executors.defaultThreadFactory(),new MyThreadPoolExecutor.MyAbortPolicy());
// MyThreadPoolExecutor myThreadPoolExecutor = new MyThreadPoolExecutor
// (5,new ArrayBlockingQueue<>(6), Executors.defaultThreadFactory(),new MyThreadPoolExecutor.MyDiscardPolicy());
// MyThreadPoolExecutor myThreadPoolExecutor = new MyThreadPoolExecutor
// (5,new ArrayBlockingQueue<>(6), Executors.defaultThreadFactory(),new MyThreadPoolExecutor.MyDiscardOldestPolicy());
MyThreadPoolExecutor myThreadPoolExecutor = new MyThreadPoolExecutor
(5,new ArrayBlockingQueue<>(6), Executors.defaultThreadFactory(),new MyThreadPoolExecutor.MyCallerRunsPolicy());
for(int i=0;i<11;i++){
int finalI = i;
myThreadPoolExecutor.execute(()->{
System.out.println(Thread.currentThread().getName()+">>>>"+ finalI);
});
}
myThreadPoolExecutor.shutdown();
// myThreadPoolExecutor.shutdownNow();
}
}好了升级版线程池就优化到这了,后面可能还会出完善版,不断进行优化。
以上就是如何优化Java线程池?的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号