java多线程使用与踩坑

news2024/10/7 18:31:16

SpringBoot使用多线程简单方法:地址
线程安全查阅资料参考:地址

背景: 经过上述资料查看,我想写个方法(依靠notify()唤醒,依靠wait()等待)实现两个线程轮流打印。
实现:
1.线程池配置

@Configuration
@EnableAsync
public class AsyncConfiguration {

    @Bean("ceshiAsync")
    public Executor doSomethingExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程数:线程池创建时候初始化的线程数
        executor.setCorePoolSize(3);
        // 最大线程数:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
        executor.setMaxPoolSize(4);
        // 缓冲队列:用来缓冲执行任务的队列
        executor.setQueueCapacity(10);
        // 允许线程的空闲时间60秒:当超过了核心线程之外的线程在空闲时间到达之后会被销毁
        executor.setKeepAliveSeconds(6);
        // 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
        executor.setThreadNamePrefix("测试线程-");
        // 缓冲队列满了之后的拒绝策略:由调用线程处理(一般是主线程)
//        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
        executor.initialize();
        return executor;
    }

}

2.轮流打印的方法( 两个方法完全一样,主要依靠list.notify(); list.wait();)

@Async("ceshiAsync")
    public void aaa(List<Integer> list) {
        System.out.println("线程A等待获取i锁");
        synchronized (list) {
            try {
                System.out.println("线程A获取了i锁");
                while (list.get(0)>-1){
                    log.info("线程A:"+list.get(0));
                    list.set(0,list.get(0)-1);
                    list.notify();
                    list.wait();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    @Async("ceshiAsync")
    public void bbb(List<Integer> list) {
        System.out.println("线程B等待获取i锁");
        synchronized (list) {
            try {
                System.out.println("线程B获取了i锁");
                while (list.get(0)>-1){
                    log.info("线程B:"+list.get(0));
                    list.set(0,list.get(0)-1);
                    list.notify();
                    list.wait();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

3.调用方法

List<Integer> list=new ArrayList<>();
    @Test
    @GetMapping(value = "ccc")
    public void ccc(){
        list.add(100);
        ceshiService.aaa(list);
        System.out.println("-----------");
        ceshiService.bbb(list);
    }

实现效果
在这里插入图片描述
在这里插入图片描述
踩坑

1.@Async注解未生效
原因:测试图方便把注解的方法直接写在控制器,调用时直接用方法名调用,固注解未生效,这种写法会导致注解失效,例如事务的注解,之前一直有看到过这种注解失效的情况,这次真遇到算是长记性了。

2.current thread is not owner(当前线程不是所有者)错误
不要直接用Integer对象当锁,查询资料Integer内部的int值是不可改变的,估计是值改变时地址变了导致报这个错。

3.执行到一半报错
效果:在这里插入图片描述
原因:有些测试不适合用@Test注解,例如这里线程池出问题,事后想想这报错完全是理所应当的事情,亏我还在怀疑是notify方法提前把锁释放了导致wait执行时没锁了。罪过罪过

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/717694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HCIA复习二---7月4

路由&#xff1a; 按照路由条目&#xff0c;逻辑选址。 控制层面&#xff1a;路由条目的加表&#xff1a;AD metric&#xff08;华为 priority cost&#xff09;&#xff1b; 数据层面&#xff1a;按照路由条目转发数据包---与操作---最长匹配---递归查找&#xff1b; 静态…

第四十三周周报

学习目标&#xff1a; latent-diffusion 代码 学习时间&#xff1a; 2023.06.17 - 2023.06.30 学习产出&#xff1a; 一、代码 1、前置知识&#xff1a;PyTorch Lightning执行顺序 执行顺序&#xff1a; trainer.fit(model)&#xff1a;开始训练模型。 prepare_data()&a…

教你如何将纬地数据与实景三维模型进行叠加

概述&#xff1a; 纬地是公路设计的常用软件&#xff0c;在国内的普及率很高。传统的纬地数据文件以二维线条形式呈现在CAD中。本文提出了一种新思路、新方法&#xff0c;即将纬地的设计成果与无人机航拍的高精度倾斜摄影模型叠加在一起&#xff0c;辅助设计方案复核。 ​纬地…

SpringBoot第19讲:SpringBoot 如何保证接口幂等

SpringBoot第19讲&#xff1a;SpringBoot 如何保证接口幂等 在以SpringBoot开发Restful接口时&#xff0c;如何防止接口的重复提交呢&#xff1f; 本文是SpringBoot第19讲&#xff0c;主要介绍接口幂等相关的知识点&#xff0c;并实践常见基于Token实现接口幂等。 文章目录 Spr…

培训报名小程序实战开发

目录 1 需求描述2 原型绘制2.1 首页2.2 报名列表页2.3 报名页2.4 支付页面2.5 支付成功页面2.6 我的页面2.7 我的报名页面2.8 报名详情页面 3 数据源设计4 数据源开发5 创建模型应用6 录入测试数据7 创建自定义应用8 创建页面总结 经常有人问&#xff0c;低代码学习容易么&…

c语言进阶-枚举、联合(共用体)

枚举 枚举项也有值属性 修改枚举项值属性 枚举的优点 define的实现过程 实际在预处理已经完成了M - 100 的替换&#xff0c;实际执行是int m 100&#xff1b; enum调试的时候更方便&#xff0c;代码变化过程都可以看到。 联合&#xff08;共用体&#xff09; 打印出来的三个…

前端学习——HTML5

新增语义化标签 新增布局标签 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&qu…

无限极 × 盖雅工场|劳动力管理系统项目正式启动,为多工厂管理保驾护航

6月12日&#xff0c;无限极盖雅工场劳动力管理系统启动大会在广东江门举行。无限极IT供应链系统负责人毛松和、智能制造总监胡波、新会生产中心负责人胡流云、营口生产中心负责人源博恩和人才资源共享服务负责人林岳&#xff0c;以及盖雅工场华南总经理潘磊等出席了启动大会。 …

ARM day6 (标准pin引脚启动)

A7核 led.h #ifndef __LED_H__ #define __LED_H__//寄存器封装 //声明一个结构体 typedef struct {volatile unsigned int MODER; //00volatile unsigned int OTYPER; //04volatile unsigned int OSPEEDR; //08volatile unsigned int PUPDR; //0Cvolatile unsigned int …

“全球筷子第一股”双枪科技携手纷享销客连接型CRM

近日&#xff0c;纷享销客携手双枪科技股份有限公司&#xff08;以下简称“双枪”&#xff09;&#xff0c;“主数据与订货管理系统”项目启动会在浙江杭州举行&#xff0c;双枪和纷享销客双方多位高管共同出席了当天的启动会&#xff0c;并针对双方项目组的紧密合作给予了一致…

【C++面向对象】用电管理数据管理系统(面向对象)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、51CTO技术博主 &#x…

word转化为ftl格式文件模板,导出后office提示文件错误

需求如下: 使用模板,导出word文件,最近在做这个需求,本地环境用的是wps,结合本地的环境快速完成了开发需求之后,有一天客户发现office打开报错,本人深感不接,wps都能打开,各个在线文档也都支持,为何office就不支持,环境不同。 分析: wps是按照office版本迭代开发…

对比学习论文-系列4

文章目录 MedCLIP: Contrastive Learning from Unpaired Medical Images and Text目标问题来源模型架构 Supervised Prototypical Contrastive Learning for Emotion Recognition in ConversationPrototypical Contrastive LearningCurriculum Strategy&#xff1a; KECP: Know…

Lion:闭源大语言模型的对抗性蒸馏

通过调整 70k 指令跟踪数据&#xff0c;Lion (7B) 可以实现 ChatGPT 95% 的能力&#xff01; 消息 我们目前正在致力于训练更大尺寸的版本&#xff08;如果可行的话&#xff0c;13B、33B 和 65B&#xff09;。感谢您的耐心等待。 **[2023年6月10日]**我们发布了微调过程中解…

MyBatis逆向工程的配置与生成

什么是逆向工程 所谓的逆向⼯程是&#xff1a;根据数据库表逆向⽣成Java的pojo类&#xff0c;SqlMapper.xml⽂件&#xff0c;以及Mapper接⼝类 等。 要完成这个⼯作&#xff0c;需要借助别⼈写好的逆向⼯程插件。 1.在pom中添加逆向工程插件 <!--定制构建过程--> <bu…

字符流的使用

1&#xff1a;文件字符流输入流-一次读取一个字符 1:文件字符输入流&#xff1a;Reader 以内存为基准&#xff0c;把磁盘文件中的数据以字符的形式读取到内存中去。 2&#xff1a;文件字符流输入流-一次读取一个字符数组 3&#xff1a;文件字符输出流 作用&#xff1a;以内存…

【现场问题】flink-cdc,Oracle2Mysql的坑,Oracle区分大小写导致

大小写导致的问题 错误的flink-cdc语句sql我们看一下oracle的数据库字段再看一下错误sql里面的内容flink报错内容 正确的sql三级目录 错误的flink-cdc语句sql CREATE TABLE t_wx_source_1 (id String,name String,age String ) WITH (connector oracle-cdc,hostname 192.168…

U-Boot移植 (3)- uboot启动Linux内核测试

文章目录 1. bootcmd 和 bootargs 环境变量1.1 环境变量 bootcmd1.2 环境变量 bootargs 2. uboot 启动 Linux 测试2.1 从 EMMC 启动 Linux 系统2.2 从网络启动 Linux 系统 3. 总结 1. bootcmd 和 bootargs 环境变量 1.1 环境变量 bootcmd bootcmd 保存着 uboot 默认命令&…

Netty专题:netty概述,及丢弃协议服务(1)

Netty 是一个 Java NIO 客户端服务器框架&#xff0c;使用它可以快速简单地开发网络应用程序&#xff0c;比如服务器和客户端的协议。Netty 大大简化了网络程序的开发过程比如 TCP 和 UDP 的 socket 服务的开发。 JDK 原生 NIO 程序的问题 JDK 原生也有一套网络应用程序 API&…

秋招算法岗c++面经

目录 1、指针与引用的区别 2.const关键字 3.重载和重写(覆盖)的区别 4.new和malloc的区别(new封装了malloc) 5.static和const的区别 6. c三大特性 7.虚函数 8.纯虚函数 9.虚继承 10. 智能指针 11. 内存泄漏 12.c的内存分布 13.STL介绍 1、指针与引用的区别 指针存…