Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 执行器与线程_Java_Multithreading_Executorservice - Fatal编程技术网

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();
}
关于上述问题,我有以下问题:

  • 是否有任何方法可以捕获并响应执行器线程上发生的异常
  • 为什么创建的线程的异常会显式传播到主线程,但使用executor服务的两次执行都不会传播该错误?如何才能发现这个错误
  • 编辑:我想到了另一个问题:

  • 我如何停止我安排的给定周期性任务,比如说在N次重复或N分钟之后

  • 问题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))