代码之家  ›  专栏  ›  技术社区  ›  Tomas

当生成程序遇到RuntimeException时,确保runnig最终位于生成的线程中?

  •  1
  • Tomas  · 技术社区  · 16 年前

    遇到了一个问题。我有一个生成的线程,必须调用它的finally块。假设下面的代码,是否可以确保调用runnable中的finally?

    import org.junit.Test;
    
    public class ThreadTest {
        @Test
        public void testThreadFinally() throws InterruptedException {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println("Going to sleep...");                    
                        Thread.sleep(1000);
                        System.out.println("slept 1000 ms");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        System.out.println("Must print this.");
                    }
                }
            };
            Thread t = new Thread(r);
            t.setDaemon(false);
            t.start();
            Thread.sleep(500);
            System.out.println("main thread about to throw runtime...");
            throw new RuntimeException("fail");
        }
    }
    
    4 回复  |  直到 16 年前
        1
  •  1
  •   jitter    16 年前

    WFM也。但在命令行中没有JUnit进行测试。可能和这有关。可能JUnit只是在发生意外的异常情况时关闭运行测试的VM。你试过添加吗

    @Test (expected=RuntimeException.class)
    

    到方法。

    或者JUnit在本例中的行为不像在 main(..) { }

    在控制台中运行时输出

    Going to sleep...
    main thread about to throw runtime...
    Exception in thread "main" java.lang.RuntimeException: fail
            at Test.main(Test.java:22)
    slept 1000 ms
    Must print this.
    
        2
  •  1
  •   Benj    16 年前

    据我所知,最终无法运行的唯一方法是,如果您的主线程调用System.Exit()。

        3
  •  1
  •   Adam Goode    16 年前

    如果您的测试工具在1000毫秒内完全运行,那么您将永远不会看到finally消息,因为JVM已经关闭了。

        4
  •  0
  •   Andrzej Doyle    16 年前

    你的问题几乎肯定是因为在六月运行这个程序,这会导致 System.exit() 待命。您的runnable,正如所写的,保证在退出前执行它的finally blocked。调用后无法退出的唯一方法是:

    • 方法本身的无限循环
    • 由于某些线程调用System.Exit()(可能是可运行的本身),进程退出。
    • Java进程在外部强制终止(例如通过UNIX) kill 命令)。