java中runnable_Java:在Runnable中处理RuntimeException

java中runnable

去年年底,我正在运行预定的任务来监视Neo4j集群,而我遇到的问题之一是有时会退出监视。

最终我意识到这是因为RuntimeException被抛出到Runnable方法中,而我没有处理它。 以下代码演示了该问题:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;public class RunnableBlog {public static void main(String[] args) throws ExecutionException, InterruptedException {ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();executor.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " -> " + System.currentTimeMillis());throw new RuntimeException("game over");}}, 0, 1000, TimeUnit.MILLISECONDS).get();System.out.println("exit");executor.shutdown();}
}

如果运行该代码,我们将看到RuntimeException,但是执行器不会退出,因为线程在没有通知的情况下就死了:

Exception in thread "main" pool-1-thread-1 -> 1391212558074
java.util.concurrent.ExecutionException: java.lang.RuntimeException: game overat java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252)at java.util.concurrent.FutureTask.get(FutureTask.java:111)at RunnableBlog.main(RunnableBlog.java:11)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:601)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.RuntimeException: game overat RunnableBlog$1.run(RunnableBlog.java:16)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351)at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)at java.lang.Thread.run(Thread.java:722)

当时我最终添加了一个try catch块并打印如下异常:

public class RunnableBlog {public static void main(String[] args) throws ExecutionException, InterruptedException {ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();executor.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {try {System.out.println(Thread.currentThread().getName() + " -> " + System.currentTimeMillis());throw new RuntimeException("game over");} catch (RuntimeException e) {e.printStackTrace();}}}, 0, 1000, TimeUnit.MILLISECONDS).get();System.out.println("exit");executor.shutdown();}
}

据我所知,这允许异常被识别,并且执行Runnable的线程不会死亡。

java.lang.RuntimeException: game over
pool-1-thread-1 -> 1391212651955at RunnableBlog$1.run(RunnableBlog.java:16)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351)at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)at java.lang.Thread.run(Thread.java:722)
pool-1-thread-1 -> 1391212652956
java.lang.RuntimeException: game overat RunnableBlog$1.run(RunnableBlog.java:16)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351)at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)at java.lang.Thread.run(Thread.java:722)
pool-1-thread-1 -> 1391212653955
java.lang.RuntimeException: game overat RunnableBlog$1.run(RunnableBlog.java:16)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351)at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)at java.lang.Thread.run(Thread.java:722)

这很好,使我能够继续监视集群。

但是,我最近开始阅读“ Java Concurrency in Practice ”(购买后仅6年!),并且意识到这可能不是处理RuntimeException的正确方法。

public class RunnableBlog {public static void main(String[] args) throws ExecutionException, InterruptedException {ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();executor.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {try {System.out.println(Thread.currentThread().getName() + " -> " + System.currentTimeMillis());throw new RuntimeException("game over");} catch (RuntimeException e) {Thread t = Thread.currentThread();t.getUncaughtExceptionHandler().uncaughtException(t, e);}}}, 0, 1000, TimeUnit.MILLISECONDS).get();System.out.println("exit");executor.shutdown();}
}

我看不到这两种方法之间的差异很大,因此如果有人可以向我解释为什么这种方法比我以前的捕获异常并打印堆栈跟踪的方法更好,那将是一个很好的选择。

参考: Java:通过Mark Needham博客博客的JCG合作伙伴 Mark Needham在Runnable中处理RuntimeException 。

翻译自: https://www.javacodegeeks.com/2014/02/java-handling-a-runtimeexception-in-a-runnable.html

java中runnable

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

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

相关文章

工业级光纤收发器产品性能特点介绍

工业级光纤收发器是一种可以延长传输距离的一种工业交换机,它具有便捷、维护简单、抗干扰性能强、性能强大、运行稳定等优点,产品设计符合以太网标准,性能稳定可靠。那么在,数据通信行业中,工业级光纤收发器到底扮演者…

【渝粤教育】 国家开放大学2020年春季 1079高等代数专题研究 参考试题

试卷代号:1083 座位号 2 0 2 0年春季学期期末统一考试 几何基础 试题 2020年7月 一、选择题(每小题4分,本题共20分) 1.如果两个向量的对应分量成比例,则二者( ). A.平行 B&#xff0…

【渝粤教育】 国家开放大学2020年春季 1107传感器与测试技术 参考试题

试卷代号:1110 座位号 2 0 2 0年春季学期期末统一考试 工程地质 试题 2020年7月 一、单项选择题(将正确答案的序号填入括号,每小题2分,共计30分) 1.工程地质条件即( )。 A.工程活动的地质环境 B…

工业级光纤收发器如何正确使用和维护?

工业级光纤收发器在越来越多的场景中运用,如何正确的使用和维护是延长工业级光纤收发器寿命的重要手段。那么,如何正确使用及维护光纤收发器呢?接下来飞畅科技的小编就给大家简单梳理一下!一起来看看吧! 1、在使用中要…

imx6的Linux默认颜色,MY-IMX6 Linux-3.14 测试手册(1)

明远智睿MY-IMX6 Linux-3.14 测试手册1 测试前的准备请按照《Linux快速启动手册》中的“Linux快速启动” -> “连接设备”进行连接。请按照《Linux快速启动手册》中的“Linux快速启动” -> “启动设备”进行启动。2 测试项目2.1 网口测试MY-IMX6-EK200支持两个百兆网口。…

JavaFX的科幻用户界面第1部分

使用JavaFX创建的Sci-Fi UI成形窗口 虚构的UI可以变成现实吗? 成长于80年代的小时候,我看到了自己的科幻电影,这确实激发了我对图形用户界面(GUI)的热爱,尤其是试图使科幻UI在现实世界中成为可能的想法。 …

【渝粤教育】 国家开放大学2020年春季 1129土木工程力学(本) 参考试题

试卷代号:1132 2 0 2 0年春季学期期末统一考试 卫生管理 试题 2020年7月 一、单选题(每题2分,共30分) 1.在进行卫生人力预测时,下列考虑了居民对卫生服务的利用程度的方法是( )。 A.卫生需要法 …

c语言程序设计21点扑克牌,C语言程序设计-21点扑克牌游戏.pdf

实验报告课程名称 : C语言程序设计实验项目 : 21点扑克牌游戏设计专业班级 : 电子信息工程实验室号 : 信息 205 实验组号 : xx实验时间 : 2010-5-4 批阅时间 :指导教师 : 成 绩 &…

【渝粤教育】 国家开放大学2020年春季 1167环境水利学 参考试题

试卷代号:1174 2 0 2 0年春季学期期末统一考试 水工钢筋混凝土结构(本) 试题 2020年7月 一、选择题(每小题2分,共20分) 在所列备选项中,选1项正确的或最好的作为答案,将选项号填入各…

NoSQL数据库程序员应该在2019年学习的5大知识

尽管Java或Web开发人员学习NoSQL数据库不是强制性的,但世界正朝着这个方向发展,Java和Web开发人员都应该熟悉NoSQL数据库。 如果您想知道NoSQL数据库是什么意思,那么这里是快速概述。 NoSQL数据库指的是非SQL,非关系或非SQL的非SQ…

光纤连接器百科小知识

光纤连接器,是光纤与光纤之间进行可拆卸(活动)连接的器件,它把光纤的两个端面精密对接起来,以使发射光纤输出的光能量能最大限度地耦合到接收光纤中去,并使由于其介入光链路而对系统造成的影响减到最小&…

【渝粤教育】 国家开放大学2020年春季 1190当代中国政治制度 参考试题

试卷代号:1194 座位号 2020年春季学期期末统一考试 建设监理 试题 2020年7月 一、单项选择题(每小题2分,共40分。每题的备选项中,只有一个最符合题意) 1.建设工程监理任务的委托方是( )。 A.工程…

emacs c语言,如何利用Emacs来调试C++程序

俗话说,Emacs是神的编辑器,而Vim是编辑器之神。高手程序员都是用这两样神器进行开发。本人觉得,Emacs之所以厉害,是因为许多在其他编辑器下必须用鼠标点选很多步的操作,在Emacs下都可以通过键盘来完成。大大地节省了你在显示器上找…

Web服务面试问答

在这篇文章中,我们涵盖了您需要熟悉的Web服务概念的几乎所有部分,以回答任何层级问题。 您还会在分类中找到最佳的Web服务面试问题和答案,因此只有在必要时才可以使用特定条款。 今天,可以在各种编程平台上开发各种Web应用程序。…

【渝粤教育】 国家开放大学2020年春季 1259西方行政学说 参考试题

试卷代号:1282 2 0 2 0年春季学期期末统一考试 社会学概论(本) 试题 2020年7月 注意事项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试 结束后,把试卷和答题纸放在桌上。试卷和答题…

什么是程控交换机?程控交换机有哪些优势?

程控交换机,全称为存储程序控制交换机(与之对应的是布线逻辑控制交换机,简称布控交换机),也称为程控数字交换机或数字程控交换机。通常专指用于电话交换网的交换设备,它以计算机程序控制电话的接续。程控交…

【渝粤教育】 国家开放大学2020年春季 1303护理伦理学 参考试题

试卷代号:1308 2 0 2 0年春季学期期末统一考试 外国文学专题 试题(开卷) 2020年7月 一、选择题(请将正确答案前的字母填在括号中。每题1分,共10分) 1.《美国的悲剧》( ) A.田纳西威廉…

二级c语言函数调用题,2013年计算机二级C语言函数调用考点归纳

2013年计算机二级、一级、三级等更多考试考前培训请进入教育联展网-中国教育培训第一门户,助您顺利通过计算机等级考试!7.5 函数的正确调用(嵌套调用,递归调用)1.调用函数时,函数名必须与被调用的函数名字完全一样。实参的个数与类…

什么是光纤以太网交换机?

光纤以太网交换机是一款高性能的管理型的二层光纤以太网接入交换机。那么,什么是光纤以太网交换机?其产品性能及技术参数都有哪些?接下来杭州飞畅科技的小编就来为大家详细介绍下光纤以太网交换机,感兴趣的朋友就一起来看看吧&…

【渝粤教育】 国家开放大学2020年春季 1325妇产科学与儿科护理学 参考试题

试卷代号:1332 2 0 2 0年春季学期期末统一考试 中文学科论文写作 试题(开卷) 2020年7月 一、填空题(每空1分,共10分) 1.从总体上说,_____________性、_____________性和____________…