如何有效地处理Java里长期运行的任务

java长时间运行任务式 当一个操作很耗时的时候,需要开启另一个线程走任务式 立即下载
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 很多时候,在应用程序运行期间你需要一个类来执行一些像数据处理、侦听事件或者检查另一个类活动情况的任务。你可能要通过一组锁定和告知来使用线程从而实现这一点。虽然Java线程API具有丰富的文档说明,但是还是需要大量的代码和经验才能让你的线程正确地和有效地工作。你可以使用暂存来避免每次需要的时候都必须编写这样的类,你也可以使用本文中将讨论的框架来创建一个更加稳健的应用程序。 -------------------------------------------------------------------------------- 获得代码 -------------------------------------------------------------------------------- 用于长期运行任务的框架 长期运行任务的主要特点是:在应用程序运行期间它必须要一直保持运行。要实现这一点的正确方法是为特定任务提供一个执行线程。你需要创建一个任务,将其作为一个线程或者作为java.lang.Runnable接口的一个实现。如果实现了Runnable,你就可以获得面向对象更好的设计,还可避免单方继承的问题。你也可以更加有效地操控Runnable实例,例如,使用一个线程池来运行,这个池通常需要一个Runnable实例,而不是一个线程。 框架的实质就是Worker抽象类(Listing A),它是用来实现Runnable接口,并为有效地处理任务提供Helper方法的。有些方法是完全实现的,比如run()方法,但是有的是抽象的,需要由你来填充。如果要创建一个长期运行的类,你只需要扩展Worker类,并实现几个抽象方法就行了。现在我们更加仔细地看看这些方法。 Worker类的run()方法是设计用来持续执行work()方法直到其停止的。work()能够负责数据处理、对某个事件做出反应、读取或者编写文件、SQL执行等等。它可以丟置例外,所以把它推广出去以及让run()方法来处理它都是好方法。 run()方法有两层try-catch子句:while循环外面和里面。第一个try-catch子句是用于捕捉所有非程序的例外,而且保证run()方法决不会退出。第二个子句会捕捉住任何属于事务逻辑的例外,并做出相应的行为。如果某个等待操作替代了work()方法(例如服务于InputStream或者Socket),那么最好传播InterruptedException。要记住的是,work()方法不需要任何while循环来维持其在应用程序运行期间的运行。Worker能为你做这件事。 run()方法开始的时候,它会调用prepareWorker(),后者是设计用来为长期运行任务(Listing A)准备所需资源的。在这个方法调用的过程中,你可以,例如建立一个数据库的连接,或者打开一个以后要被用到的文件。在这个地方放置一些封锁操作,例如打开一个socket,将会是非常好的,因为它们会在一个单独的线程里完成,这样就不会封锁主执行线程了。 前一个方法相反的方法是releaseWorker(),它在run()即将退出的时候(Listing A)被调用。这里,你可以使用代码来释放这个任务所使用的系统资源,或者进行其他的清除工作。这个方法和java.lang.Object.finalize()相类似,但是它是在线程中止之前被明确调用的。 处理框架的错误 另一个重要的方法是handleError(),它把java.lang.Throwable作为一个参数。这个方法在每次run()方法里出现错误情形时被调用。轮到你实现错误处理了。一种方法是通过调用halt()方法(Listing A)登记错误和控制任务的终止。 isCondition()方法是被用来告知work()方法的执行是否能被启动,这样就能允许对任务的精确控制了。在work()方法的执行悬而未决,直到出现某个条件为止——例如,缓存非空,的这段时间里,事件触发框架是很有用的。在Worker的实现里,条件会按照锁定告知的内容定期被检查,其时间间隔由你在setTimeout()方法(Listing A)里指定。如果不需要任务里的任何等待区段,那么你只用让isCondition()方法总是返回真值就行了。 什么时候中止 你还需要isRunning()、broadcast()和halt()方法。查询isRunning(),你可以检查一个任务是否还在运行,并决定是否中止它。broadcast()方法只是用来通知锁定对象并让任务继续运行的,如果它一直服务于这个锁定的话。halt()方法能够停止一个任务,所以run()方法会在下一个isRunning()的状态一被检查的时候就退出。由于这个方法只通知能够封锁这个任务线程的锁定,所以当你在work()方法里(Listing B)进行锁定操作的时候最好使用同一个锁定对象。如果不能使用同一个锁定对象,例如在你正在追踪java.io.InputStream.read()方法的时候,你就应该向halt()添加所有可能锁定的明确告知,或者向其添加java.lang.Thread.interrupt()。如果被追踪的对象能正确地处理这个信号,那么java.lang.Thread.interrupt()就能正常工作了。例如,它能对InputStream.read()起作用,但是对java.sql.PreparedStatement.execute()就没有用了,所以每个特定的情况下你都必须测试halt()方法。 一旦熟悉了如何使用Worker类,你就可以很容易地创建自己的实现(Listing B)。要把这个类作为一个线程来运行,只用简单地使用一个新的Thread(new WaitedWorker()).start就行了。使用Thread.interrupt()或者Worker.halt()或者两者联合使用,你就能精确地控制任务的执行了。例如,你可以通过把相应的代码放到java.lang.Runtime.addShutdownHook()方法里,这样在JVM停止的时候就能够停止所有的worker了。 结论 我们已经了解了长期运行任务的框架,也看过了如何在其抽象类的基础上创建一个新的任务。其构架是很清晰和灵活的,设计初就具有可扩展性。有了这个框架,你可以避免从暂存里创建类,也能够开发更加有效和可靠的应用程序了。
【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针赋值和测试 本文介绍了当使用Tessy对软件进行单元测试时如何打桩和指针相关测试的注意事项及操作要点,希望能给正在摸索Tessy的网友一点点启发。 阅读详情

相关推荐

什么是plm系统?-数字化转型网

当今世界,产品研发能力是企业在激烈的市场竞争中保持战略优势的核心竞争力之一。如何有效地缩短产品研发周期、改善产品服务的设计迭代流程、有效降低产品的研发成本,也是企业面临的主要问题之一。PLM(Product Lifecycle Management,产品生命周期管理)在优化产品研发的全管理流程、增强企业产品的市场竞争力方面具有关键的作用。

cxo17757154043的博客 883

java任务_在JAVA中如何实现长时间任务

展开全部62616964757a686964616fe59b9ee7ad9431333332643335一、问题背景    在应用程序中我们经常需要一个类去完成像数据处理、监听事件或检查另一个类的活动等任务。为了达到这个目标,我们可能使用带有一套锁和消息通知的线程。JAVA 线程API已经很好的文档化,但为了使线程能够正确而高效地运行,程序员仍然需要丰富的编程经验并编写大量的代码。通过应用本篇文章...

weixin_36215903的博客 703

显示模组Bonding IC气泡问题的诊断与优化策略

本文深入分析了显示模组Bonding IC气泡问题的成因与优化策略,涵盖IC两端剥离气泡、彩虹状水汽气泡、电极下方无规律气泡及IC输入端气泡等类型。通过工艺参数优化、材料存储处理、清洁环境控制及维修品特殊处理等多维度解决方案,有效降低气泡不良率。同时介绍了纳米改性ACF材料、激光辅助排泡技术等前沿解决方案,为触控显示行业提供实用参考。

weixin_26805597的博客 420

如何处理Java中的方法过长?

在大型Java应用程序中,方法过长(即代码块过大)是一个常见的问题。长方法不仅难以阅读和理解,还增加了维护成本和错误的风险。本文将讨论一些策略和技巧,帮助您优化和管理长方法,使代码更加清晰和易于维护。通过分割长方法、使用Helper方法、设计模式以及Lambda表达式和Stream API,我们可以有效地处理Java中方法过长的问题,提高代码的可读性和可维护性。在实际开发中,根据具体情况选择合适的策略,并结合团队的编码规范和最佳实践,将有助于编写高质量的Java代码。

微赚淘客系统开发者博客 1102

《揭秘 BME688人工智能压力湿度温度气体传感器:气体检测的多面能手》:此文为AI自动生成

BME688 是博世推出的一款具有人工智能和集成高线性度高精度压力、湿度、温度传感器的气体传感器,专为移动和联网应用开发,尺寸紧凑且低功耗。BME688 作为一款先进的传感器,在多个领域展现出卓越的性能。它采用了坚固而紧凑的 3.0 x 3.0 x 0.9 mm³ 封装,这种小巧的尺寸使其能够轻松应用于对空间要求严格的移动设备和联网应用中。同时,低功耗的特性也使得它在能源有限的环境下能够长时间稳定运行。

zheng_ruiguo的专栏 1936

Ubuntu下Ollama局域网共享大模型服务:5分钟搞定配置与防火墙设置

本文提供了一份在Ubuntu系统上快速配置Ollama实现局域网共享大模型服务的实战指南。通过修改服务配置使其监听所有网络接口,并设置UFW防火墙规则,用户可在5分钟内让同一Wi-Fi下的其他设备(如笔记本、手机)便捷调用主机上的AI模型能力,实现团队或多设备间的AI资源共享。

ik6789012的博客 825

在JAVA中如何实现长时间任务

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 751

激光雷达与相机时间戳同步:原理、触发方案与工程实现

目录一、引言:时间不同步,多传感器融合必出问题二、核心原理:相机成像机制与触发模式(同步的基础)2.1 相机成像的两个核心阶段:曝光与读出(1)非交叠曝光(2)交叠曝光2.2 相机触发模式:内触发 vs 外触发(1)内触发(2)外触发2.3 关键信号:Strobe信号与预输出(同步的核心技巧)三、三种主流时间戳同步方案(工程落地首选)3.1 方案一:统一硬触发(精度最高,高端场景首选)核心原理核心配置要点优缺点适用场景3.2 方案二:软触发+硬触发(Strobe预输出,车载量产首选)核心原理核心配置要点优缺

getusushu的博客 205

java 线程 一直运行状态_关于Java 线程的运行状态

首先需要说明的是,所指状态为JVM线程状态,而非操作系统线程状态。同一时间,一个线程只会存在于一种状态。线程状态,enum State:1、NEW已创建,未运行。2、RUNNABLE线程于JVM中运行中。3、BLOCKED阻塞等待 monitor lock 以进入或重新进入 synchronized 同步块或方法,由Object.wait 触发。4、WAITING触发方法:Object.wait...

weixin_28956461的博客 669

2025 华为OD机试真题e卷 C语言 实现【竖直四子棋】

竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子,棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子。

MISAYAONE的博客 1418

【ComfyUI 基础教程】ComfyUI 局部重绘工作流教程

本篇指南将带你了解 ComfyUI 中的局部重绘工作流,并带你完成一个局部重绘的示例,以及遮罩编辑器的使用等。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 303

面试:线程池核心线程如何保持一直运行的

对于Java中 Thread 对象,同一个线程对象调用 start 方法后,会在执行完run 后走向终止(TERMINATED)状态,也就是说一个线程对象是不可以通过多次调用 start 方法重复执行 run 方法内容的。通过队列的 take 方法阻塞核心线程(Worker)的 run 方法从而保证核心线程不被销毁的,这样也就间接达到了核心线程数不会被回收的效果。如果没有设置 allowCoreThreadTimeOut 为 True, 以及当前线程池内线程数量不大于核心线程。

王温暖的博客 3606

华为OD机试新系统真题-魔法咒语组合(Java/Py/C++/Go/C/Js)

华为OD机试 新系统真题【魔法咒语组合】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【魔法咒语组合】多语言题解

qq_45776114的博客 671

Java SE,Java EE:到底是什么

JavaSE是Java的标准版,提供基础语法、类库和运行环境,是Java开发的核心基础。JavaEE则是基于SE的企业扩展版,增加了Servlet、JPA等企业级规范,适用于开发大型Web应用和分布式系统。两者关系为:SE是必学基础,EE是进阶选择,开发企业应用需先掌握SE再学习EE的核心技术。学习路径建议从SE开始,逐步过渡到EE相关框架。

m0_73884648的博客 2166

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java SE Downloads

<br />Latest Release  <br />Next Release (Early Access)<br />  <br />Embedded Use<br />  <br />Real-Time<br />  <br />Previous Releases<br />  Java Platform (JDK)JDK  

qiaolevip的专栏 1190

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java SE 和 Java EE 的区别

Java SE与Java EE核心区别摘要(150字) Java SE是Java标准版,提供JVM、核心类库(集合/IO/线程等)和基础开发工具,适用于桌面程序和控制台应用,是所有Java开发的基础。Java EE是企业版扩展规范,基于Java SE增加Servlet、JSP、EJB等API,专为分布式高并发系统设计(如电商/金融平台),需部署至Tomcat等服务器运行。学习路径必须先掌握Java SE,再进阶Java EE或相关框架(如Spring)。注意:2018年后Java EE更名为Jakarta

weixin_45784564的博客 577

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

安装JAVA SE 安装包

单击下一步,完成第一步安装。 第一步安装程序 一般来说JAVA SE安装包包括JDK和JRE的安装。默认的安装目录一般不用修改。默认的选择也不要修改。 单击下一步,完成第二步安装。 第二步定制安装 等待第三步安装完成。 第三步进度 安装过程中弹出警告信息,此警告信息会在JAVA SE DEVELOPMENT KIT 8版本出现。 第四步警告信息 单...

lihongtao8209的专栏 3423

【JAVA SE】SE总结

javase总结:java数据类型介绍;java如何读取键盘输入;java如何生成随机数;java方法重载;java数组的定义、获取数组长度、遍历数组,以及工具类Arrays:如何将数组排序、拷贝数组;类和对象:抽象类、接口、Object类、内部类、String类的相关方法介绍;java异常体系结构

lzb_kkk的博客 1297

java se embedded_Oracle Java SE, Java SE Embedded, JRockit本地安全漏洞

Oracle Java SE, Java SE Embedded, JRockit本地安全漏洞发表日期:2015-01-24 13:50:40Oracle Java SE, Java SE Embedded, JRockit本地安全漏洞(CVE-2015-0383)BugTraq-ID:72155CVE-ID:CVE-2015-0383发布日期:2015-01-20更新日期:2015-01-21受...

weixin_32023449的博客 363

免登陆从Oracle下载Java SE

一,为何会有这篇博文 因为某些原因,从orcale官网下载Java SE很慢,并且需要注册ocacle账户。 目前没有找到其他的安全有效的下载源。 看不下去orcale这么能作,帮助一下苦难的萌新程序猿。 二,如何免登陆下载 参考gist上的帖子->传送门,自己构造下载链接,使用wget下载。 参考 rathaROG 的办法,构造下载链接,使用任意下载器下载。具体如下: (Personal note only) How to generate link for the future upda

乐不思书的碎碎念 1191

java se下载_Java SE - Downloads | Oracle Technology Network | Oracle 台灣

Java SE 15Java SE 15.0.2 is the latest release for the Java SE PlatformLooking for Oracle OpenJDK builds?Oracle Customers and ISVs targeting Oracle LTS releases:Oracle JDK is Oracle's supported Java S...

weixin_31937319的博客 1504

java java se_Java SE 7、8、9 –推动Java前进

java java se 今天(注:2011年10月4日)是主题演讲日。 JavaOne Keynote将于今早从上午8:30到10:30进行,而我的新闻通行证又一次让我很早就参加了。 因此,我有时间在所有关键球员准备就绪并可能感到紧张的同时为其拍摄一些非常个性化的照片。 宴会厅A + B很大。 与去年相比,他们改变了安排,把舞台摆在了长边。 这使许多人更了解发生的事情,这真是一种很棒的感觉...

最佳 Java 编程 277

java java se_Java SE 9:尝试资源改进

java java se 发表简要目录: (Post Brief Table of Content:) Introduction 介绍 Java SE 7: Try-With-Resources Basics Java SE 7:试用资源基础 Java SE 7: Try-With-Resources Rules Java SE 7:试用资源规则 Java SE 9: Try-With-Resou...

从零开始的教程世界 319

Java SE——0.Java SE 大纲

比特就业课Java SE——Java SE 思维总结大纲

要努力去发光,而不是被照亮~ 754

Java 版本变更列表 (Java SE 8 ~ Java SE 18 )

java 版本变更列表Java SE 8Java SE 9Java SE 10Java SE 11Java SE 12Java SE 13Java SE 14Java SE 15Java SE 16Java SE 17Java SE 18 参考资料: Wiki :java 版本历史 Java SE 8 Java 8 于 2014 年 3 月 18 日发布 JSR 335,JEP 126 :lambda 表达式支持 JSR 223,JEP 174 :Nashorn项目,一个 JavaScript 运行时,它

QFann的博客 2077

Java SE 学习

Java语言的前身是Sun Microsystems公司开发的一种用于智能化家电的名为Oak的语言,并以C和C++语言为基础。在1993年,由于WWW(万维网)的迅速发展,被用来创造含有动态内容的WWW网页的Oak语言被改造并改名为Java语言(Java源于盛产咖啡的印尼爪哇岛),两年后被正式推出。随之,Java语言被业界广泛接受。又因Java Servlet和Java Server Page的推出,Java语言的地位越来越重要。

2602_95375588的博客 521
上一篇: 用Oracle导入导出工具实现Oracle数据库移植
下一篇: AOP是什么?
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值