异步任务系列一
程序员文章站
2022-07-14 22:47:54
...
写在这之前,我啰嗦几句吧,说说如何把自己的个人编程能力提高一个档次,可能基本的java代码我们已经写了千遍万遍了,感觉技术总停留在这个层次,无法突破,这可能是一般程序员所要经历的一个过程,这个时候你需要从前辈,牛人那里汲取营养,无非是仔细研磨开源代码,从中理解他们的编程思想,编程习惯,解决问题的方式,想想如果自己来实现,我们会怎么实现,当然,这个过程是异常艰辛的,可能看着一堆堆的代码,网状似的交横,眼睛都看干涩了,但你不能走马观花,似懂非懂,很难从中学到精髓,你必须看了一遍又一遍,仔细推敲,我相信久了,不经之中你已在慢慢突破自己了,当然也许是个人之言,但是为己之经历,一切贵在沉静坚持,好了,说正题了。
异步任务调度:
提到这个,不觉想到了Timer,TimerTask,FutureTask,Future,ScheduledExecutorService等
说起来,Timer,TimerTask大家可能使用到更多一点,然而,这个类其实提供的功能有限,不够灵活,其中还存在一个最大的坏处就是方法体内如果处理抛出异常,可能停止了调度任务的能力,而ScheduledExecutorService这个异步类则解决了这一点,好了贴上代码
package com.taobao.common.store.journal.test; import java.util.Timer; import java.util.TimerTask; /** * 我们来讲讲timer与ScheduledExecutorService的区别 */ public class TimerTest { private Timer timer = new Timer(); //启动计时器 public void lanuchTimer(){ timer.schedule(new TimerTask(){ public void run() { //人为抛出异常,timer停止,无法派发任务 throw new RuntimeException(); } }, 1000*3, 500); } //向计时器添加一个任务 public void addOneTask(){ timer.schedule(new TimerTask(){ public void run(){ System.out.println("hello world"); } }, 1000*1,1000*5); } public static void main(String[] args) throws Exception { TimerTest test = new TimerTest(); test.lanuchTimer(); Thread.sleep(1000*5);//5秒钟之后添加一个新任务 test.addOneTask(); } }
package com.taobao.common.store.journal.test;
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledExecutorTest { //线程池能按时间计划来执行任务,允许用户设定计划执行任务的时间,int类型的参数是设定 //线程池中线程的最小数目。当任务较多时,线程池可能会自动创建更多的工作线程来执行任务 public ScheduledExecutorService scheduExec = Executors.newScheduledThreadPool(1); //启动计时器 public void lanuchTimer(){ Runnable task = new Runnable() { public void run() { System.out.println("难道就不执行了吗?"); throw new RuntimeException(); } }; scheduExec.scheduleWithFixedDelay(task, 1000*5, 1000*10, TimeUnit.MILLISECONDS); } //添加新任务 public void addOneTask(){ Runnable task = new Runnable() { public void run() { System.out.println("welcome to china"); } }; scheduExec.scheduleWithFixedDelay(task, 1000*1, 1000, TimeUnit.MILLISECONDS); } public static void main(String[] args) throws Exception { ScheduledExecutorTest test = new ScheduledExecutorTest(); test.lanuchTimer(); Thread.sleep(1000*5);//5秒钟之后添加新任务 test.addOneTask(); } }
在下面篇幅,会慢慢讲解下异步任务系统及实战。