java - 确保当生成器遇到 RuntimeException 时,最终在生成的线程中运行?

标签 java multithreading

遇到问题了。我有一个生成的线程,必须调用它的finally block 。假设下面的代码,是否可以确保调用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");
    }
}

最佳答案

WFM 也是如此。但在命令行中没有使用 jUnit 进行了测试。可能与此有关。当发生意外异常时,jUnit 可能只是关闭运行测试的虚拟机。您是否尝试添加

@Test (expected=RuntimeException.class)

到方法。

或者在这种情况下,jUnit 的行为并不像在 main(..) { } block 中运行相同的代码

在控制台中运行时的输出

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.

关于java - 确保当生成器遇到 RuntimeException 时,最终在生成的线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1757379/

相关文章:

wpf - 在 WPF 中处理第二个 UI 线程

java - 这个 Java 程序能打印出一个非零值吗?

java - 关于双重检查单例

java - 再次检查一个列表中的所有内容,导致堆栈溢出

Java读入一个文本文件,然后分成单独的数组

java - Android 4.0 ICS 将 HttpURLConnection GET 请求转为 POST 请求

c - 高效网络服务器设计实例,C语言编写

java - Gson - 将 JSON 解析为对象时忽略 json 字段

c++ - 如何使用多线程处理缓存数据结构(例如 openmp)

c++ - QThread 线程间通信:连接到 &QThread::quit 与连接到 lambda [&thread] { thread->quit();} 的奇怪行为