定义一个延时任务,可以切换三种状态:
- 正常执行
- 抛出异常
- 抛出异常并捕获
import java.text.SimpleDateFormat;
import java.util.Date;
public class ScheduleWorker implements Runnable{
public final static int Normal = 0;//普通任务类型
public final static int HasException = -1;//会抛出异常的任务类型
public final static int ProcessException = 1;//抛出异常但会捕捉的任务类型
public static SimpleDateFormat formater = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
private int taskType;
public ScheduleWorker(int taskType) {
this.taskType = taskType;
}
@Override
public void run() {
if(taskType==HasException) {
System.out.println(formater.format(new Date())
+" Exception has been made,will next task run?");
throw new RuntimeException("ExceptionHappen");
}else if(taskType==ProcessException) {
try {
System.out.println("ProcessException ..."
+formater.format(new Date()));
throw new RuntimeException("ProcessException");
} catch (RuntimeException e) {
System.out.println("ProcessException has been caught,will next task run?");
}
}else {
System.out.println("Normal..."+formater.format(new Date()));
}
}
}
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ScheduledCase {
public static void main(String[] args) {
ScheduledThreadPoolExecutor schedule
= new ScheduledThreadPoolExecutor(1);
schedule.scheduleAtFixedRate(new ScheduleWorker(ScheduleWorker.Normal),
0, 3000, TimeUnit.MILLISECONDS);
// 固定时间间隔执行的任务,开始执行后就触发异常,next周期将不会运行
// schedule.scheduleAtFixedRate(new ScheduleWorker(ScheduleWorker.HasException),
// 0, 3000, TimeUnit.MILLISECONDS);
// 固定时间间隔执行的任务,虽然抛出了异常,但被捕捉了,next周期继续运行
// schedule.scheduleAtFixedRate(new ScheduleWorker(ScheduleWorker.ProcessException),
// 0, 3000, TimeUnit.MILLISECONDS);
}
}
结果:
无异常:
抛出异常,但不捕获:
抛出异常,捕获:
可以从结果中看出:
异常如果不处理好,任务可能不会正常进行。
对于线程和线程池的异常处理情况比较麻烦,但只要记住:
在Runnable.run()使用try-catch处理异常是绝对没有问题的。
参考:Mark—笔记_Java并发编程