在执行延时执行的时候,Timer抛出异常之后会出现线程终止,无法进行下个线程的执行(利用idea中的插件检测出来的)
上代码
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
private Timer timer = new Timer();
public void launchTimer() {
timer.schedule(new TimerTask(){
@Override
public void run() {
System.out.println("launchTimer");
throw new RuntimeException();
}
}, 1000*3, 500);
}
public void addOneTask() {
timer.schedule(new TimerTask(){
@Override
public void run() {
System.out.println("hello world");
}
}, 1000*1, 1000*5);
}
public static void main(String[] args) throws InterruptedException {
TimerTest test = new TimerTest();
test.launchTimer();
Thread.sleep(5000);
test.addOneTask();
}
}
Timer执行延迟的时候会出现第一个 launchTimer出现异常,整个任务就会终止,addOneTask不会继续执行
会出现这种报错(执行第一个之后,运行终止) Timer运行结果
但是将Timer更换成ScheduledExecutorService之后,代码如下
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestScheduledExecutorService {
private ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").build());
public void launchTimer() {
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("launchTimer");
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
},1000*3, 500, TimeUnit.MILLISECONDS);
}
public void addOneTask() {
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("addOneTask");
}
},500,1000*5,TimeUnit.MILLISECONDS);
}
public static void main(String[] args) throws InterruptedException {
TestScheduledExecutorService testScheduledExecutorService = new TestScheduledExecutorService();
testScheduledExecutorService.launchTimer();
Thread.sleep(5000);
testScheduledExecutorService.addOneTask();
}
}
执行结果如下 ScheduledExecutorService运行结果
launchTimer
java.lang.Exception
at com.medical.design.controller.website.TestScheduledExecutorService$1.run(TestScheduledExecutorService.java:22)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
java.lang.Exception
at com.medical.design.controller.website.TestScheduledExecutorService$1.run(TestScheduledExecutorService.java:22)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
launchTimer
launchTimer
java.lang.Exception
at com.medical.design.controller.website.TestScheduledExecutorService$1.run(TestScheduledExecutorService.java:22)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
launchTimer
java.lang.Exception
at com.medical.design.controller.website.TestScheduledExecutorService$1.run(TestScheduledExecutorService.java:22)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
launchTimer
java.lang.Exception
at com.medical.design.controller.website.TestScheduledExecutorService$1.run(TestScheduledExecutorService.java:22)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
launchTimer
java.lang.Exception
at com.medical.design.controller.website.TestScheduledExecutorService$1.run(TestScheduledExecutorService.java:22)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
addOneTask
launchTimer
java.lang.Exception
at com.medical.design.controller.website.TestScheduledExecutorService$1.run(TestScheduledExecutorService.java:22)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
java.lang.Exception
at com.medical.design.controller.website.TestScheduledExecutorService$1.run(TestScheduledExecutorService.java:22)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
launchTimer
...........
ScheduledExecutorService运行的时候遇到异常不会影响下一个线程的执行,而Timer遇到异常之后会出现直接终止
或者将ScheduledExecutorService其中的 throw new Exception();更改为 throw new RuntimeException();
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestScheduledExecutorService {
private ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").build());
public void launchTimer() {
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("launchTimer");
throw new RuntimeException();
}
},1000*3, 500, TimeUnit.MILLISECONDS);
}
public void addOneTask() {
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("addOneTask");
}
},500,1000*5,TimeUnit.MILLISECONDS);
}
public static void main(String[] args) throws InterruptedException {
TestScheduledExecutorService testScheduledExecutorService = new TestScheduledExecutorService();
testScheduledExecutorService.launchTimer();
Thread.sleep(5000);
testScheduledExecutorService.addOneTask();
}
}
执行结果是
launchTimer
addOneTask
addOneTask
addOneTask
addOneTask
.........