iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >spring scheduled单线程和多线程使用的坑怎么解决
  • 597
分享到

spring scheduled单线程和多线程使用的坑怎么解决

2023-06-29 01:06:50 597人浏览 薄情痞子
摘要

本篇内容介绍了“spring scheduled单线程和多线程使用的坑怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!公司在

本篇内容介绍了“spring scheduled单线程多线程使用的坑怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

公司在使用定时任务的时候,使用的是spring scheduled。

代码如下:

@EnableSchedulingpublic class TaskFileScheduleService {    @Scheduled(cron="0 */1 * * * ?")    public void task1(){    .......    }        @Scheduled(cron="0 */1 * * * ?")    public void task2(){    .......    }

某天,接到领导的电话,说生产环境的定时任务不跑了,赶紧给看看~
做为一名负责人的程序员,赶紧放下手中泡面,远程到公司的电脑~
线程卡死这种问题,第一步当然是将JVM中的heap dump和thread dump导出来~
经过简单分析,thread dump中某个线程确实一直处理running状态,heap dump没啥问题~
thread dump中的问题线程:

"pool-2-thread-43" #368 prio=5 os_prio=0 tid=0x00005587fd54c800 nid=0x1df runnable [0x00007ff7e2056000]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:171)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.net.SocketInputStream.read(SocketInputStream.java:224)
    at ch.ethz.ssh3.transport.ClientServerHello.readLineRN(ClientServerHello.java:30)
    at ch.ethz.ssh3.transport.ClientServerHello.<init>(ClientServerHello.java:67)
    at ch.ethz.ssh3.transport.TransportManager.initialize(TransportManager.java:455)
    at ch.ethz.ssh3.Connection.connect(Connection.java:643)
    - locked <0x000000074539e0e8> (a ch.ethz.ssh3.Connection)
    at ch.ethz.ssh3.Connection.connect(Connection.java:490)
    - locked <0x000000074539e0e8> (a ch.ethz.ssh3.Connection)
    at com.suneee.yige.medicalserver.common.SSHUtils.connect(SSHUtils.java:24)
    at com.suneee.yige.medicalserver.service.TaskFileScheduleService.getConn(TaskFileScheduleService.java:102)
    at com.suneee.yige.medicalserver.service.TaskFileScheduleService.taskInfo(TaskFileScheduleService.java:108)
    at com.suneee.yige.medicalserver.service.TaskFileScheduleService.task(TaskFileScheduleService.java:74)
    at sun.reflect.GeneratedMethodAccessor295.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

很明显,ch.ethz.ssh3.Connection.connect这个方法卡死,导致线程一直处于running状态。

由于spring scheduled默认是所有定时任务都在一个线程中执行!!这是个大坑!!!
也就是说定时任务1一直在执行,定时任务2一直在等待定时任务1执行完成。这就导致了生产上定时任务全部卡死的现象。

问题已经很明确了,要么解决ch.ethz.ssh3.Connection.connect卡死的问题,要么解决spring scheduled单线程处理的问题。

首先,想到的是处理ch.ethz.ssh3.Connection.connect卡死的问题,但是经过一番查找,发现这个ssh的工具包很久没更更新过了,也没有设置例如Httpclient的超时时间之类的。这就很难办了!果断放弃!!

现在只剩一条路,怎么在任务1卡死的时候,任务2可以按他自己的周期执行,且任务1也按照固定周期执行,不会因为某次任务1卡死导致后续的定时任务出现问题!

方法一:

添加配置

@Configurationpublic class ScheduleConfig implements SchedulinGConfigurer {    @Override    public void configureTasks(ScheduledTaskReGIStrar taskRegistrar) {        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(50));    }}

这个方法,在程序启动后,会逐步启动50个线程,放在线程池中。每个定时任务会占用1个线程。但是相同的定时任务,执行的时候,还是在同一个线程中。
例如,程序启动,每个定时任务占用一个线程。任务1开始执行,任务2也开始执行。如果任务1卡死了,那么下个周期,任务1还是处理卡死状态,任务2可以正常执行。也就是说,任务1某一次卡死了,不会影响其他线程,但是他自己本身这个定时任务会一直等待上一次任务执行完成!
这种显然不行!这也是踩过坑才知道的!!!

方法二(正解):

添加配置:

@Configuration@EnableAsyncpublic class ScheduleConfig {    @Bean    public TaskScheduler taskScheduler() {        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();        taskScheduler.setPoolSize(50);        return taskScheduler;    }}

在方法上添加注解@Async

@EnableSchedulingpublic class TaskFileScheduleService {    @Async    @Scheduled(cron="0 */1 * * * ?")    public void task1(){    .......    }        @Async    @Scheduled(cron="0 */1 * * * ?")    public void task2(){    .......    }

这种方法,每次定时任务启动的时候,都会创建一个单独的线程来处理。也就是说同一个定时任务也会启动多个线程处理。
例如:任务1和任务2一起处理,但是线程1卡死了,任务2是可以正常执行的。且下个周期,任务1还是会正常执行,不会因为上一次卡死了,影响任务1。
但是任务1中的卡死线程越来越多,会导致50个线程池占满,还是会影响到定时任务。
这时候,可能会几个月发生一次~到时候再重启就行了!

“spring scheduled单线程和多线程使用的坑怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: spring scheduled单线程和多线程使用的坑怎么解决

本文链接: https://www.lsjlt.com/news/321691.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • spring scheduled单线程和多线程使用的坑怎么解决
    本篇内容介绍了“spring scheduled单线程和多线程使用的坑怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!公司在...
    99+
    2023-06-29
  • springscheduled单线程和多线程使用过程中的大坑
    公司在使用定时任务的时候,使用的是spring scheduled。 代码如下: @EnableScheduling public class TaskFileScheduleSer...
    99+
    2024-04-02
  • SpringBoot中的Scheduled单线程执行问题怎么解决
    本篇内容主要讲解“SpringBoot中的Scheduled单线程执行问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot中的Scheduled单线程执行问题怎么解决”...
    99+
    2023-07-02
  • Spring多线程怎么使用
    这篇“Spring多线程怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring多线程怎么使用”文章吧。为什么使用...
    99+
    2023-06-30
  • 解决SpringBoot中的Scheduled单线程执行问题
    目录问题描述原因分析:解决方案:补充:问题描述 在一次SpringBoot中使用Scheduled定时任务时,发现某一个任务出现执行占用大量资源,会导致其他任务也执行失败。类似于以下...
    99+
    2024-04-02
  • 怎么解析Redis6中的单线程和多线程模型
    这篇文章的内容主要围绕怎么解析Redis6中的单线程和多线程模型进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!1....
    99+
    2024-04-02
  • SpringBoot中定时任务@Scheduled的多线程使用详解
    目录一、@Scheduled注解简介二、@Scheduled的多线程机制三、@Scheduled的多线程问题四、@Scheduled加入线程池来处理定时任务五、@Scheduled详...
    99+
    2023-05-17
    SpringBoot定时任务@Scheduled原理 SpringBoot定时任务@Scheduled使用 SpringBoot定时任务@Scheduled
  • 解决线程并发redisson使用遇到的坑
    线程并发redisson的坑 背景 因为业务上的一个购买需求,需要对库存进行行程保护,防止超卖的出现(我们不是电商公司),经过调研,最终选择使用Redission来进行控制。 主要因...
    99+
    2024-04-02
  • 解决线程池中ThreadGroup的坑
    目录线程池中ThreadGroup的坑ThreadGroup是否可行Executors内部类DefaultThreadFactoryThreadGroup的使用及手写线程池监听线程异...
    99+
    2024-04-02
  • python 多进程和多线程使用详解
    目录进程和线程 Python的多进程 进程池 多进程间的数据通信与共享 Python的多线程 多线程间的数据共享 使用queue队列通信-经典的生产者和消费者模型进程和线程 进程是...
    99+
    2024-04-02
  • C#单线程和多线程端口扫描器详解
    目录一、项目创建以及页面设计(一)项目新建(二)页面设计二、单线程实现端口扫描(一)代码实现(二)运行结果三、多线程实现端口扫描(一)程序实现(二)运行结果四、总结五、参考资料本文为...
    99+
    2024-04-02
  • Java多线程 - 线程安全和线程同步解决线程安全问题
    文章目录 线程安全问题线程同步方式一: 同步代码块方式二: 同步方法方式三: Lock锁 线程安全问题 线程安全问题指的是: 多个线程同时操作同一个共享资源的时候可能会出现业务安全问题,称为线程安全问题。 举例:...
    99+
    2023-08-20
    java 安全 jvm
  • java怎么使用多线程解决主线程提前结束问题
    这篇文章主要介绍“java怎么使用多线程解决主线程提前结束问题”,在日常操作中,相信很多人在java怎么使用多线程解决主线程提前结束问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java怎么使用多线程解决...
    99+
    2023-07-05
  • Spring多线程的使用以及问题详解
    目录前言为什么使用多线程Springboot中是否对多线程方法进行了封装如何控制线程运行中的各项参数corePoolSize:核心线程数maximumPoolSize:最大线程数ke...
    99+
    2024-04-02
  • Python中多线程和线程池的使用方法
    Python是一种高级编程语言,它在众多编程语言中,拥有极高的人气和使用率。Python中的多线程和线程池是其强大的功能之一,可以让我们更加高效地利用CPU资源,提高程序的运行速度。本篇博客将介绍Py...
    99+
    2023-10-12
    python
  • java怎么使用线程池启动多线程
    在 Java 中,可以使用线程池来启动多线程。以下是使用线程池启动多线程的示例代码:首先,需要导入 `java.util.concu...
    99+
    2023-09-15
    java
  • Java多线程之线程安全问题怎么解决
    本篇内容主要讲解“Java多线程之线程安全问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多线程之线程安全问题怎么解决”吧!1.线程安全概述1.1什么是线程安全问题首先我们需要...
    99+
    2023-06-30
  • C#单线程和多线程的端口扫描器应用比较详解
    目录一、准备工作二、端口扫描器(单线程)三、端口扫描器(多线程)四、总结本文章使用C#编程,制作一个端口扫描器,能够扫描本机有哪些端口开放了,并显示出来,分别使用单线程和多线程进行了...
    99+
    2024-04-02
  • 什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?
    文章目录 前言我们为什么要使用线程而不是进程来实现并发编程什么是线程进程和线程的区别如何使用Java实现多线程创建线程1.创建一个继承 Thread 类的线程类2.实现 Runnable 接口匿名内部类方式实现 Runnable ...
    99+
    2023-08-19
    java JavaEE 多线程 进程
  • Python多线程怎么使用
    本篇内容主要讲解“Python多线程怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python多线程怎么使用”吧!Python 多线程多线程类似于同时执行多个不同程序,多线程运行有如下优...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作