问题现象:

现象1.开启定时任务线程池,线程池貌似消失了,定时任务突然中断,既不执行也不报错

现象2:跟换定时任务实现方式,使用@Scheduled,同意的现象依然出现了,定时任务跑到一定频率突然不动

解决思路:

1.程序未抛出异常,某个时期却突然不在执行,怀疑线程阻塞了

2.查询jvm线程状态(jstack java进程ID >threadDump.log)将dump日志下载分析,发现该线程期处于runnable 状态,其他任务一直waiting,可以看出应该是http请求导致的

"scheduling-1" #62 prio=5 os_prio=0 tid=0x00007f36a6fc2000 nid=0x813e runnable [0x00007f3651125000]java.lang.Thread.State: RUNNABLEat 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 sun.security.ssl.InputRecord.readFully(InputRecord.java:465)at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:593)at sun.security.ssl.InputRecord.read(InputRecord.java:532)at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:990)- locked <0x00000006a6bb48d8> (a java.lang.Object)at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:948)at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)- locked <0x00000006a6bb4f38> (a sun.security.ssl.AppInputStream)at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)at org.apache.http.impl.io.SessionInputBufferImpl.read(SessionInputBufferImpl.java:197)at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:188)at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:135)at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)- locked <0x00000006a6cab1e0> (a java.io.InputStreamReader)at java.io.InputStreamReader.read(InputStreamReader.java:184)at java.io.Reader.read(Reader.java:140)at org.apache.http.util.EntityUtils.toString(EntityUtils.java:227)at org.apache.http.util.EntityUtils.toString(EntityUtils.java:308)at com.coco.util.HttpUtil.sendPost(HttpUtil.java:40)

3.查询资料,httpclient有一个这样的坑,必须配置http超时时间,否则请求未响应,会导致read一直处于阻塞状态,会导致程序假死

4.配置httpclient超时时间,问题解决,代码如下

// 设置超时时间-务必设置,否则导致程序阻塞或线程假死int MAX_SOKET_TIMEOUT = 10000;int MAX_CONNECTION_TIMEOUT = 8000;RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(MAX_SOKET_TIMEOUT).setConnectTimeout(MAX_CONNECTION_TIMEOUT).build();CloseableHttpClient clientExecutor = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();

5.思考扩展,导致假死的状态不只这一种,有可能是io、有可能是死循环(递归死循环等)、有可能是互斥锁,等等,都可以通过分析thread dump文件来得到线索

java 定时任务假死 定时任务阻塞 线程池消失相关推荐

  1. java阻塞线程池_线程池解决阻塞方法

    一.序言 当我们需要使用线程的时候,我们可以新建一个线程,然后显式调用线程的start()方法,这样实现起来非常简便,但在某些场景下存在缺陷:如果需要同时执行多个任务(即并发的线程数量很多),频繁地创 ...

  2. Java并发学习之玩转线程池

    2019独角兽企业重金招聘Python工程师标准>>> 线程池的使用姿势 基本上实际的项目不可能离开线程池,只是看你有没有注意到罢了 作为以业务需求为驱动,最顺溜的是写if-else ...

  3. Java多线程学习(八)线程池与Executor 框架

    历史优质文章推荐: Java并发编程指南专栏 分布式系统的经典基础理论 可能是最漂亮的Spring事务管理详解 面试中关于Java虚拟机(jvm)的问题看这篇就够了 目录: [TOC] 本节思维导图: ...

  4. java set和get原理_Java线程池的实现原理和使用

    为什么用线程池 在我们进行开发的时候,为了充分利用系统资源,我们通常会进行多线程开发,实现起来非常简单,需要使用线程的时候就去创建一个线程(继承Thread类.实现Runnable接口.使用Calla ...

  5. Java 并发编程——Executor框架和线程池原理

    Java 并发编程系列文章 Java 并发基础--线程安全性 Java 并发编程--Callable+Future+FutureTask java 并发编程--Thread 源码重新学习 java并发 ...

  6. [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors...

    [Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...

  7. Java多线程学习六:使用线程池比手动创建线程好在那里以及常用线程池参数的意义

    为什么要使用线程池 首先,回顾线程池的相关知识,在 Java 诞生之初是没有线程池的概念的,而是先有线程,随着线程数的不断增加,人们发现需要一个专门的类来管理它们,于是才诞生了线程池.没有线程池的时候 ...

  8. 线上服务Java进程假死快速排查、分析

    线上服务Java进程假死快速排查.分析 最近我们有一台服务器上的Java进程总是在运行个两三天后就无法响应请求了,具体现象如下: 请求业务返回状态码502,查看进程还在,意味着Java进程假死,无法响 ...

  9. [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ...

    [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ... 摘要 介绍 Java 并发包里的几个主要 ExecutorService . 正文 ...

  10. java中使用Semaphore构建阻塞对象池

    java中使用Semaphore构建阻塞对象池 Semaphore是java 5中引入的概念,叫做计数信号量.主要用来控制同时访问某个特定资源的访问数量或者执行某个操作的数量. Semaphore中定 ...

最新文章

  1. 一天搞定HTML----常用标签01
  2. 程序最小化后释放了很多的内存的原因
  3. 江苏省2013年会计从业资格考试《会计基础》全真模拟试题
  4. 【笔记】基于轻量和积网络及无人机遥感图像的大豆田杂草识别
  5. 【Python】20个Pandas数据实战案例,干货多多
  6. [论文浅析]ICLR2017 跨语言,跨任务,跨领域序列标注
  7. 多多自走棋改动_多多自走棋腾讯版
  8. 179. 最大数---LeetCode---JAVA
  9. HDOJ2567 ( 寻梦 ) 【切水题,很欢乐~】
  10. 蓝桥杯第五届省赛JAVA真题----七对数字
  11. Linux PPP实现源码分析-2
  12. c语言编译器储存有什么用,C编译器怎么样对内存划分和使用
  13. ofdma技术_数字化领航 | Wi-Fi 6 关键技术剖析
  14. 电脑图片格式怎么批量转换jpg?几个小妙招轻松转换
  15. 有赞实时数仓建设实践与经验
  16. 局域网,手机与电脑文件共享
  17. JDF代码学习 JDF入门教程 代码配置
  18. 访问任何dns都超时_如何使用动态DNS从任何地方轻松访问您的家庭网络
  19. 手机也可以快速翻译、PDF翻译超简单
  20. anti-SG 游戏

热门文章

  1. 服务器XP系统打印机共享设置,如何设置打印机共享_教你在xp系统上设置打印机共享 - 驱动管家...
  2. cmd下载的python包,pycharm中却无法使用
  3. windows无法格式化u盘_U盘无法格式化的解决方法
  4. ip扫描命令 linux,如何使用Linux扫描网络上的IP地址
  5. 整人网页html语言网站,html愚人节整人一直弹的网页窗口怎么做?
  6. Python爬取微博数据
  7. QQ魔法卡片辅助工具外挂silverlight版
  8. 分享:世界机场代码(ICAO)[带经纬度]
  9. “深入浅出”学Golang!就选《Head First Go》
  10. LoadRunner教程01:性能测试常见用语