Java 执行器与线程
我正在尝试运行以下代码:Java 执行器与线程,java,multithreading,executorservice,Java,Multithreading,Executorservice,我正在尝试运行以下代码: public static void main(String[] args){ ScheduledExecutorService service = new ScheduledThreadPoolExecutor(2); Runnable r = new Runnable() { @Override public void run() { throw new RuntimeException();
public static void main(String[] args){
ScheduledExecutorService service = new ScheduledThreadPoolExecutor(2);
Runnable r = new Runnable() {
@Override
public void run() {
throw new RuntimeException();
}
};
service.execute(r );
ScheduledFuture<?> schedule = service.schedule(r, 0, TimeUnit.SECONDS);
new Thread(r).run();
}
publicstaticvoidmain(字符串[]args){
ScheduledExecutorService服务=新的ScheduledThreadPoolExecutor(2);
Runnable r=新的Runnable(){
@凌驾
公开募捐{
抛出新的RuntimeException();
}
};
服务执行(r);
ScheduledFuture schedule=service.schedule(r,0,TimeUnit.SECONDS);
新线程(r.run();
}
关于上述问题,我有以下问题:
问题2非常简单-您实际上并没有启动一个新线程,您只是调用
run()
,它在原始线程中同步运行。您应该调用start()
,此时异常不会传播回来
至于处理ScheduledExecutorService
中的异常-如果调用,如果原始任务引发异常,它将引发异常,将原始异常暴露为原因:
尝试检索通过引发异常而中止的任务的结果时引发异常。可以使用Throwable.getCause()
方法检查此异常
如果您需要在不阻塞的情况下响应异常,以便将来完成,您可以将您的“real”
Runnable
包装在另一个“real”run()
方法中,但带有适当的try/catch块。您可以这样捕获它:
ScheduledFuture<?> schedule = service.schedule(r, 0, TimeUnit.SECONDS);
try {
Object get = schedule.get();
} catch (InterruptedException ex) {
ex.printStackTrace();
} catch (ExecutionException ex) {
ex.printStackTrace();
}
ScheduledFuture schedule=service.schedule(r,0,TimeUnit.SECONDS);
试一试{
Object get=schedule.get();
}捕获(中断异常例外){
例如printStackTrace();
}捕获(ExecutionException ex){
例如printStackTrace();
}
如果在(预定)ExecutionService
中运行的代码出现异常,则在调用
包装到ExecutionException
编辑:
关于停止计划的任务,它已经停止了。谢谢,但是有没有办法将异常传播到主线程/调用线程?@Bober02:use
Future.get()
真的就是这样。毕竟,您不希望原始线程在任意时间点抛出异常,是吗?在N次尝试或N分钟后,您如何停止一个临时计划?由于偶然,我今天做了一个关于线程的讲座。我告诉我的学生:如果我觉得淘气,我会有代码让你在考试中分析。该代码可能包含t.run(),而不是t.start()。请参阅我的更新,它已在alreadyOK中解决,但如果我有一个定期计划的未来呢?是否只捕获第一个异常?是否将运行任何后续执行?相同。对不,它们[不会](,long,long,java.util.concurrent.TimeUnit))