欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

异步任务系列一

程序员文章站 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();
	}
}

 

    在下面篇幅,会慢慢讲解下异步任务系统及实战。