在Java中若何实现长时间任务[Java编程]
本文“在Java中若何实现长时间任务[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
择要: 在软件开辟中,我们常常面对着处理长时间任务的多线程编程问题.在我们的ezOne平台的开辟中就多处触及到,如JPC数据服务JPC数据处理服务 报警联动 门禁系统等.本人在编写DEMO程序的历程中几易其稿,煞操心机,但仍然感受有很多地方需求改良,为了削减多线程编程带来的风险,我翻译整理了一个近似问题的办理筹划框架以到达一劳永逸. 为了便于阅读,保存原文.引用请保存作者和文章根源.
关键词: Thread、 Lock 、 Notification、长时间任务.
在利用程序中我们常常需求一个类去完成像数据处理、监听事件或查抄另一个类的活动等任务.为了到达这个目标,我们大概利用带有一套锁和消息告诉的线程.JAVA 线程API已经很好的文档化,但为了使线程可以精确而高效地运行,程序员仍旧需求丰富的编程经验并编写大量的代码.通过利用本篇文章中谈论的框架,程序员可以避免忍耐煎熬写大量的代码,快速成立结实的利用程序. 2、长时间运行任务的程序框架.
关于长时间运行的任务的主要事情是如安在利用程序的生命期使它一向保持运行.实现的得当办法是供应一个线程来履行这个特定的任务.我们可以通过担当Thread类或实现java.lang.Runnable接口来到达该目标.假如采取实现Runnable接口的方法,便可以可以得到更好的面向对象的计划,同时可以避免JAVA中的单担当问题.别的,我们也能更有效的处理Runnable实例(比方利用线程池普通需求一个Runnable实例而不是线程来运行).
框架的底子是一个叫Worker的抽象类,它实现了Runnable接口,并供应了有效处理任务的好办法.这些办法有些已经被实现,如run()办法,但有些是抽象办法,开辟人员必须自己来实现.假如要成立一个长时间运行的类,你只需求担当Worker类并实现几个抽象办法.让我们看看这些办法的细节.
Worker 类的run()办法被计划成只要不断止运行就持续的履行work()办法.work()办法可以负责数据处理、事件呼应、文件读写、,履行SQL号令等操作.这样work()办法可以抛出非常,并将非常传给run(),然后由run()办法来处理这些非常.
run()办法有内外两层try-catch语句:一层处于while-loop循环外,一层在while-loop循环内.前一个try-catch用于捕捉非编程非常以确保run()办法不退出.后一个try-catch语句捕捉关于业务逻辑和呼应行为的各种非常.假如在work()办法中发生了一些等候操作(比方等候一个输入流或一个Socket),抛出一个InterruptedException的办法是可取的.要记着的是只要利用程序在运行,work()办法不需求任何while-loop循环去保持它运行,这一切由Worker代办了.
run()开始时,调用prepareWorker()办法来预备长时间运行任务需求的全部资源(参考程序清单A).比方 ,在这个办法中可以翻开一个将要用到的数据库衔接或文件.特别关于那些像成立一个socket这样的阻塞操作放在这儿是很好的.因为若让它们在一个独立的线程中运行,则不会阻塞主线程的履行.
与前面办法相反的是releaseWorker(),它在run()办法预备退出时被调用(参考程序清单A).在该办法中你可以编写那些释放系统资源或履行别的排除行动的代码.该办法近似于java.lang.Object.finalize(),但它在线程中止时被显式的调用.
3、框架中的错误处理机制
另一个重要的办法是handleError(),它带有一个java.lang.Throwable的输入参数.在run()办法每次发生错误时调用这个办法.这依靠于你怎么实现错误处理.办法之一是写错误日记并通过调用halt()办法中止任务(参考程序清单A).
isCondition()办法用于判断work()办法能否可以被履行.因此答应细粒度地掌握任务.这在事件触发的框架中非常有效.当work()办法的履行条件未满意时,work办法将被挂起,直到条件完好满意(比方,缓存区非空).在Worker的实现中这个条件将按在办法setTimeout()中指定的时间周期地查抄一个锁告诉.假如在任务中不需求任多么候阻塞,仅仅只要使isCondition()办法老是返回真值.
4、任务终止机会
你还需求isRunning(), broadcast(), halt()办法.通过拜候isRunning()办法,你将能查抄某个任务能否正在运行,并决意能否中止它.broadcast()办法精确地告诉锁对象,并且假如这个对象一向等候这个锁,那么就激活这个任务.halt()办法中止一个任务,因此下一isRunning()状况一旦被调用,run()办法就退出,因为这个办法只告诉那个大概阻塞这个任务线程的锁.当在work()办法中履行阻塞功课时用相同的锁是明智的.假如你不能用相同的锁对象时,比方在履行java.io.InputStream.read()办法碰到阻塞时,你就应当增添全部大概锁的显式告诉大概增添java.lang.Thread.interrupt()到halt()中.假如一个你阻塞的对象被精确处理,java.lang.Thread.interrupt()将会起作用.比方,它在InputStream.read()履行时有作用,但在履行java.sql.PreparedStatement.execute()不起作用,因此在每个特别的条件下你必须测试halt()办法.
一旦你熟习Worker类,你就很简单成立你自己的实现(参考程序清单B),为了把这类当作一个线程运行,仅仅只需简单地利用 new Thread(new WaitedWorker()).start.利用Thread.interrupt()或Worker.halt()或它们的组合,你便可以精确的掌握任务的履行.比方当JVM通过在java.lang.Runtime.addShutdownHook()办法中放呼应的代码终止时,你就可以终止全部的任务.
5、结论
我们已经查抄了长时间运行任务框架,并且看到怎样通过从成立一个基于它的抽象类的任务.它的构架是清楚和机动的,并且被计划成可扩大的.用这个框架你能避免为创作类而挖空心机,并且帮忙你可以开辟出高效、坚固的利用程序.
以上是“在Java中若何实现长时间任务[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |