书籍
《Java并发编程的艺术》—方腾飞,第8章
场景说明
拉取kafka的数据,多线程把数据追加到HDFS文件里,要求每个医院每一天的数据存放在一个文件中,每个文件有一个锁,这些锁由一个Map维护。定期清理n天前的文件的锁对象(之前的文件不会再写入数据,所以这个文件的锁也没用了)。
这里简单实现周期性执行任务。
实例代码
1、任务类
package java7.thread.chapter2.test2;
import java.text.SimpleDateFormat;
public class C1 implements Runnable {
@Override
public void run() {
// 打印当前时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(format.format(System.currentTimeMillis()));
}
}
2、测试
package java7.thread.chapter2.test2;
import java.text.SimpleDateFormat;
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) {
// 带调度策略的任务执行器
ScheduledExecutorService pool = Executors.newScheduledThreadPool(16);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("开始:"+format.format(System.currentTimeMillis()));
// C1:要周期性执行的任务
// 2L:多久后第一次执行任务
// 5L:以后每隔多久执行一次
// TimeUnit.SECONDS:第二个和第三个参数的时间单位
ScheduledFuture<?> schedule = pool.scheduleAtFixedRate(new C1(), 2L, 5L, TimeUnit.SECONDS);
}
}
运行结果
07秒开始计时,2秒后第一次执行,以后每5秒执行一次,一直执行下去。。。