技术标签: 多线程
转载:https://www.cnblogs.com/xuwangs/p/8251728.html
闲话少说,
Tomcat日志报错及堆栈信息:
因为这个问题,挂了几个节点。
跟踪报错的代码发现代码中用到future.get()方法:
Callable<Object> myCallable = createThreadCallable(interfaceName, httpbody, authSeedVo);
Future<Object> future = threadPool.submit(myCallable);
try {
super.sendJson(future.get().toString());
} catch (Exception e) {
logger.error("delsub", "获取子线程时发生异常", e);
}
任务由线程池提供的线程执行,那么这时候主线程则会阻塞,直到任务线程唤醒它们。获取结果时,通过future.get()方法获取:
当 s<= COMPLETING时,表明任务仍然在执行且没有被取消。如果它为true,那么走到awaitDone方法。
下面来看看awaitDone方法里面干了啥:
/**
* Awaits completion or aborts on interrupt or timeout.
*
* @param timed true if use timed waits
* @param nanos time to wait, if timed
* @return state upon completion
*/
private int awaitDone(boolean timed, long nanos)
throws InterruptedException {
final long deadline = timed ? System.nanoTime() + nanos : 0L;
WaitNode q = null;
boolean queued = false;
for (;;) {
if (Thread.interrupted()) {
removeWaiter(q);
throw new InterruptedException();
}
int s = state;
if (s > COMPLETING) {
if (q != null)
q.thread = null;
return s;
}
else if (s == COMPLETING) // cannot time out yet
Thread.yield();
else if (q == null)
q = new WaitNode();
else if (!queued)
queued = UNSAFE.compareAndSwapObject(this, waitersOffset,
q.next = waiters, q);
else if (timed) {
nanos = deadline - System.nanoTime();
if (nanos <= 0L) {
removeWaiter(q);
return state;
}
LockSupport.parkNanos(this, nanos);
}
else
LockSupport.park(this);
}
}
一屏截图不完整,主要截图引起阻塞的判断条件:
如果给定的时间是非0(负数)或者给定的时间(正数, 时间单位时毫秒)已经过去了(0的时候会一直阻塞着)
此处因为网络或者其他原因,导致主线程调用future.get()方法时,任务子线程还没有从对接的第三方获取到数据,致使子线程挂起(等待唤醒),从而一直消耗线程池中的资源。
建议修改方案:去掉多线程操作;或者调用future.get(long timeout, TimeUnit unit)方法;
因为当任务正常结束或者异常时,都会调用finishCompletion去唤醒等待线程。
查看官方文档,寻找park方法:
字面理解park,就算占住,停车的时候不就把这个车位给占住了么?起这个名字还是很形象的。unpark,占住的反义词,就是释放。把车从车位上开走。
翻译一下:
参考文章:
java.util.concurrent.locks.LockSupport类详解:https://my.oschina.net/readjava/blog/282882
futureTask:http://www.cnblogs.com/maypattis/p/5827671.html
文章浏览阅读442次。深度学习一部分矩阵求导知识的搬运总结_向量变元是什么
文章浏览阅读8次。近期,裁员的公司越来越多今天想和大家聊聊职场人的新出路。作为席卷全球的新概念ESG已然成为当前各个行业关注的最热风口目前,国内官方发布了一项ESG新证书含金量五颗星、中文ESG证书、完整ESG考试体系、名师主讲...而ESG又是与人力资源直接相关甚至在行业圈内成为大佬们的热门话题...当前行业下行,裁员的公司也越来越多大家还是冲一冲这个新兴领域01 ESG为什么重要?在双碳的大背景下,ESG已然成...
文章浏览阅读356次。云计算快速渗透到众多的行业,使中小企业受益于技术变革。最近微软SMB的一项研究发现,到今年年底,78%的中小企业将以某种方式使用云。企业希望投入少、收益高,来取得更大的发展机会。云计算将中小企业信息化的成本大幅降低,它们不必再建本地互联网基础设施,节省时间和资金,降低了企业经营风险。科技创新已成时代的潮流,中小企业上云是创新前提。云平台稳定、安全、便捷的IT环境,提升企业经营效率的同时,也为企业..._系统上云的前后对比
文章浏览阅读899次。出现选网卡的时候无法选中,这里应该是一个bug。3.保存退出,重启虚拟机即可。1.先随便选择一个网卡。2.勾先取消再重新勾选。_esxi虚拟机无法联网
文章浏览阅读1.7k次。参考链接:https://blog.csdn.net/fljhm/article/details/79281655一开始以为是内核的问题,所以一直在升级内核,thinkpad采用的是rtl的网卡,所以我的网卡一直没有加载出来,跟博客的问题很像,采用了很多方法的都没有解决好,期间遇到/boot的内存不足的问题,想升级到18.04是有点困难,解决好这个问题可以愉快的使用linux了。..._e580断开充电器后wifi无法连接
文章浏览阅读3.8k次。Java面试题系列——JavaSE面试题(集合二)_javase 面试题
文章浏览阅读2.2k次,点赞4次,收藏12次。高手请一笑而过。物理实验课别人已经做过3、4个了,自己一个还没做呢。不是咱不想做,而是咱不想起那么早,并且仅有的一次起得早,但是哈工大的服务器竟然超负荷,不停刷新还是不行,不禁感慨这才是真正的“万马争过独木桥“啊!服务器不给力啊……好了,废话少说。其实,我的想法很简单。写一个三重循环,不停地提交,直到所有的数据都accepted。其中最关键的是提交最后一个页面,因为提交用户名和密码后不需要再访问其..._哈尔滨工业大学抢课脚本
文章浏览阅读4.9k次。一些别人收集的英文站点 http://www.lifeinchina.cn (nice) http://www.huaren.us/ (nice) http://www.hindu.com (okay) http://www.italki.com www.talkdatalk.com (transfer)http://www.en8848.com.cn/yingyu/index._study english html
文章浏览阅读5.5k次,点赞19次,收藏78次。什么是栈?在谈M3堆栈之前我们先回忆一下数据结构中的栈。栈是一种先进后出的数据结构(类似于枪支的弹夹,先放入的子弹最后打出,后放入的子弹先打出)。M3内核的堆栈也不例外,也是先进后出的。栈的作用?局部变量内存的开销,函数的调用都离不开栈。了解了栈的概念和基本作用后我们来看M3的双堆栈栈cortex-M3内核使用了双堆栈,即MSP和PSP,这极大的方便了OS的设计。MSP的含义是Main..._stm32 msp psp
文章浏览阅读1.6k次。VC++的图形工作方式物理坐标系设备场景MFC中的设备场景CDC类的部分成员函数Windows的图形对象1.建立图形对象2.对该对象进行初始化3.将该对象选入当前设备场景,并保留初始对象4.画图5.恢复原始对象实例实验一 二维图形绘制金刚石一笔绘三种方法..._绘图程序计算机图形学
文章浏览阅读751次。★ 先说一个通俗的例子 考虑到证书体系的相关知识比较枯燥、晦涩。俺先拿一个通俗的例子来说事儿。 ◇ 普通的介绍信 想必大伙儿都听说过介绍信的例子吧?假设 A 公司的张三先生要到 B 公司去拜访,但是 B 公司的所有人都不认识他,他咋办捏?常用的办法是带公司开的一张介绍信,在信中说:兹有张三先生前往贵公司办理业务,请给予接洽......云云。然后在信上敲上A公司的公章。_rsa和ca的区别
文章浏览阅读467次。学C语言就是学内存int *p = NULL;这里的/*是在定义时使用的,说明p是指针变量,而不是普通变量printf("%d\n",*p);这里的/*的表示取p保存的地址编号对应空间的内容..._c语言a[4][4]