Python 官方文档:入门教程 => 点击学习
目录Java手写线程池(第二代)第二代线程池的优化线程池构造器线程池拒绝策略execute方法手写线程池源码MyExecutorServiceMyRejectedExecutionE
1:新增了4种拒绝策略。分别为:MyAbortPolicy、MyDiscardPolicy、MyDiscardOldestPolicy、MyCallerRunsPolicy
2:对线程池MyThreadPoolExecutor的构造方法进行优化,增加了参数校验,防止乱传参数现象。
3:这是最重要的一个优化。
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
package com.springframework.concurrent;
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;
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;
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;
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);
}
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 线程池改良版的文章就介绍到这了,更多相关Java 线程池内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: 学生视角手把手带你写Java 线程池改良版
本文链接: https://lsjlt.com/news/143253.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0