java多线程使用与踩坑

这篇具有很好参考价值的文章主要介绍了java多线程使用与踩坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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);
    }

实现效果
java多线程使用与踩坑,java,windows,开发语言
java多线程使用与踩坑,java,windows,开发语言
踩坑

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

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

3.执行到一半报错
效果:java多线程使用与踩坑,java,windows,开发语言
原因:有些测试不适合用@Test注解,例如这里线程池出问题,事后想想这报错完全是理所应当的事情,亏我还在怀疑是notify方法提前把锁释放了导致wait执行时没锁了。罪过罪过文章来源地址https://www.toymoban.com/news/detail-519503.html

到了这里,关于java多线程使用与踩坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录

    RabbitMQ 是一个功能强大的开源消息队列系统,它实现了高效的消息通信和异步处理。 本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验。 成熟,稳定 消息持久化 灵活的消息路由 高性能,高可用性,可扩展性高 支持插件系统:RabbitMQ 具有丰富的插件系统,可以通

    2024年02月06日
    浏览(41)
  • 前端html2canvas生成截图【实现步骤与踩坑】

    需求 :点击下载可以导出组件的 截图 及数据信息文件 分析 :前端生成组件截图,带着其他参数传给后端,拿到excel文件并下载。关键在于生成组件的截图,这里通过 html2canvas 插件来实现。 1.下载插件 npm install html2canvas 2.引入 3.通过ref拿到要下载组件的dom元素 4.通过html2ca

    2024年04月11日
    浏览(48)
  • Java/Python/Go不同开发语言在进程、线程和协程的设计差异

    在多线程项目开发时,最常用、最常遇到的问题是 1,线程、协程安全 2,线程、协程间的通信和控制 本文主要探讨不同开发语言go、java、python在进程、线程和协程上的设计和开发方式的异同。 进程 进程是 操作系统进行资源分配的基本单位,每个进程都有自己的独立内存空

    2024年01月23日
    浏览(47)
  • ElasticSearch学习01——Windows10环境下ES安装经验与踩到的坑

    由于对ES基本概念和历史演进在网上随处可查,所以本文在此不做赘述.随意本文直接讲述如何安装使用ES ​ ElasticSearch是基于lucence开发的,也就是运行需要java jdk支持。所以要先安装JAVA环境。由于ElasticSearch 5.x 往后依赖于JDK 1.8的,所以最好安装JDK1.8及以上版本.具体安装方法可

    2024年02月12日
    浏览(37)
  • 【Windows线程开发】Windows线程同步技术

    我们在上一章节中讲解了关于Windows的线程基础,相信大家已经对线程有了基本的概念。这一章节中,我们来讲讲线程同步技术,包括加锁技术(原子锁和互斥体)和事件,信号量。 原子锁主要解决的问题是多线程在操作符方面的问题。 相关问题: 多个线程对同一个数据进行

    2024年02月04日
    浏览(54)
  • 【Windows线程开发】线程基础

    本篇文章来带领大家了解Windows线程,了解线程的基本概念,了解线程的创建方式,以及一些简单的线程操作。 Windows线程是可以执行的代码的实例,系统是以线程为单位调度程序。一个程序中可以有多个线程,实现多任务的处理。 Windows线程的特点: 每个线程都具有一个ID 每

    2024年02月04日
    浏览(41)
  • 【C语言】Windows下的C语言线程编程详解

    在Windows平台下,C语言提供了一套丰富的线程( Thread )编程接口,使得开发者可以轻松地实现多线程并发操作。本文将详细介绍如何在Windows环境下使用C语言创建、管理和同步线程,以及一些常见的线程操作技巧。 这里指的是使用MSVC编译,Windows下也可以使用gcc,这时可以使

    2024年04月29日
    浏览(46)
  • redis7.2.1在windows中通过docker使用的踩坑

    原本主要是参考了这两篇文章 https://blog.csdn.net/weixin_45821811/article/details/116211724 https://cloud.tencent.com/developer/article/1670205 但是由于都是基于linux系统下的,可能与windows有些不同。 首先,在https://hub.docker.com/_/redis?tab=tags docker官网上找到官方镜像,  根据提示在powershell中docker pu

    2024年02月08日
    浏览(42)
  • Langchain-Chatchat大语言模型本地知识库的踩坑、部署、使用

    Langchain-Chatchat是一个基于ChatGLM大语言模型与Langchain应用框架实现,开源、可离线部署的检索增强生成(RAG)大模型的本地知识库问答应用项目。 GitHub: https://github.com/chatchat-space/Langchain-Chatchat 本项目实现原理如下图所示,过程包括加载文件 - 读取文本 - 文本分割 - 文本向量化

    2024年02月04日
    浏览(70)
  • 不同开发语言在进程、线程和协程的设计差异

    在多线程项目开发时,最常用、最常遇到的问题是 1,线程、协程安全 2,线程、协程间的通信和控制 本文主要探讨不同开发语言go、java、python在进程、线程和协程上的设计和开发方式的异同。 进程 进程是 操作系统进行资源分配的基本单位,每个进程都有自己的独立内存空

    2024年01月22日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包