diff --git a/src/.vuepress/public/assets/project/swagger.png b/src/.vuepress/public/assets/project/swagger.png new file mode 100644 index 0000000..7121f35 Binary files /dev/null and b/src/.vuepress/public/assets/project/swagger.png differ diff --git a/src/posts/java/ThreadPoolExecutor.md b/src/posts/java/ThreadPoolExecutor.md new file mode 100644 index 0000000..cbff263 --- /dev/null +++ b/src/posts/java/ThreadPoolExecutor.md @@ -0,0 +1,73 @@ +--- +title: ThreadPoolExecutor线程池 +article: true +icon: editor +date: 2023-09-24 +category: + - JAVA学习 + +tag: + - 多线程 + - JUC +--- + +# ThreadPoolExecutor线程池 + +> 参考:[什么是线程池](https://javabetter.cn/thread/pool.html#%E4%B8%80%E3%80%81%E4%BB%80%E4%B9%88%E6%98%AF%E7%BA%BF%E7%A8%8B%E6%B1%A0) + +## 1. 什么是线程池 + +线程池其实是一种池化的技术实现,**池化技术的核心思想就是实现资源的复用,避免资源的重复创建和销毁带来的性能开销**。线程池可以管理一堆线程,让线程执行完任务之后不进行销毁,而是继续去处理其它线程已经提交的任务。 + +## 2. 线程池运行原理 + + +## 3. ThreadPoolExecutor执行方法 + +```java +// 一共分为三步 +public void execute(Runnable command) { + // 首先检查提交的任务是否为null,是的话则抛出NullPointerException。 + if (command == null) + throw new NullPointerException(); + // 获取线程池的状态,包括线程池状态(?),工作线程数量,初始数量为负数 + // get获取线程的value + int c = ctl.get(); + + // 1. 检查当前运行的工作线程数是否少于核心线程数(corePoolSize) + if (workerCountOf(c) < corePoolSize) { + // 少于核心线程数量则添加worker + if (addWorker(command, true)) + return; + c = ctl.get(); + } + + // 2. 尝试将任务添加到任务队列中 + if (isRunning(c) && workQueue.offer(command)) { + int recheck = ctl.get(); + // 双重检查线程池的状态 + if (! isRunning(recheck) && remove(command)) // 如果线程池已经停止,从队列中移除任务, && 左面为true才会执行remove函数移除任务 + reject(command); + // 如果线程池正在运行,但是工作线程数为0,尝试添加一个新的工作线程 + else if (workerCountOf(recheck) == 0) + addWorker(null, false); + } + // 3. 如果任务队列满了,尝试添加一个新的非核心工作线程来执行任务 + else if (!addWorker(command, false)) + reject(command); + } +``` + +```java +private static final int CAPACITY = (1 << COUNT_BITS) - 1; +private static int workerCountOf(int c) { return c & CAPACITY; } //与运算获取线程数 +``` + +```java +private static final int SHUTDOWN = 0 << COUNT_BITS; +private static boolean isRunning(int c) { return c < SHUTDOWN; } //小于0,即为线程池正在运行 +``` + +```java +workQueue.offer(command) // 能够添加返回True,不能添加返回False +``` \ No newline at end of file diff --git a/src/posts/project/Swagger3_learn.md b/src/posts/project/Swagger3_learn.md new file mode 100644 index 0000000..61844ab --- /dev/null +++ b/src/posts/project/Swagger3_learn.md @@ -0,0 +1,143 @@ +--- +icon: edit +date: 2023-09-24 +article: true +category: + - 项目分享 +tag: + - SpringBoot2 + - Swagger3 +--- + +# Swagger接口文档分享 + +## 1. Swagger 整合 +swagger官网: https://swagger.io/ +Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 +### 1.1 maven 依赖导入 +```xml + + io.springfox + springfox-boot-starter + 3.0.0 + +``` + +### 1.2 application 配置 +```yml +springfox: + documentation: + swagger-ui: + enabled: true +``` + +### 1.2 Swagger Config 配置 +```java +import io.swagger.annotations.ApiOperation; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import springfox.documentation.builders.*; +import springfox.documentation.oas.annotations.EnableOpenApi; +import springfox.documentation.schema.ScalarType; +import springfox.documentation.service.*; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author: SunHB + * @createTime: 2023/09/24 上午11:00 + * @description: + */ +@Configuration +@EnableOpenApi +public class Swagger3Config { + + + @Bean + public Docket createRestApi() { + //返回文档摘要信息 + return new Docket(DocumentationType.OAS_30) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + //.apis(RequestHandlerSelectors.basePackage("com.ytkj.controller")) + .paths(PathSelectors.any()) + .build() + .globalRequestParameters(getGlobalRequestParameters()) + .globalResponses(HttpMethod.GET, getGlobalResponseMessage()) + .globalResponses(HttpMethod.POST, getGlobalResponseMessage()); + } + + /** + * 生成接口信息,包括标题、联系人等 + */ + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("yantu测试接口文档") + .description("如有疑问,可联系孙鸿博") + .version("1.0") + .build(); + } + + /** + * 封装全局通用参数 + */ + private List getGlobalRequestParameters() { + List parameters = new ArrayList<>(); + return parameters; + } + + /** + * 封装通用响应信息 + */ + private List getGlobalResponseMessage() { + List responseList = new ArrayList<>(); + responseList.add(new ResponseBuilder().code("404").description("未找到资源").build()); + return responseList; + } + + +} +``` + + +## 2. Swagger 展示接口方法 + +@Api:用在类上,说明该类的作用。 + +@ApiOperation:注解来给API增加方法说明。 + +@ApiImplicitParams : 用在方法上包含一组参数说明。 + +@ApiImplicitParam:用来注解来给方法入参增加说明。 + +@ApiResponses:用于表示一组响应 + +```java +@RestController +@Slf4j +@RequestMapping("/test") +@Api(tags = "测试接口管理") +public class TestController +``` + +```java +@ApiOperation(value = "主控测试接口") +@PostMapping("/chat") +@CrossOrigin +public Result testChat +``` + +```java +@ApiOperation(value = "文档模块测试接口") +@PostMapping("v1/docQA") +@CrossOrigin +public Result docQA +``` + +访问: http://localhost:port/swagger-ui/index.html +![ES 框架图](/assets/project/swagger.png) \ No newline at end of file