如何崩溃线程或故意挂起线程?

时间:2016-08-03 07:09:51

标签: java multithreading runnable jvm-crash

好奇我崩溃后如何检查线程状态。到目前为止,我做了一些System.exit(0)或(1),但在我看来线程仍然存活并且可以运行 - 期待它被终止。这是我检查线程的测试代码

public static void main(String[] args) {
    Runnable runnableJob = new JobThatImplementsRunnableJob();
    Thread testThread  = new Thread(runnableJob);

    System.out.println("this is the testThread "+testThread.getState());
    System.out.println("thread is alive " + testThread.isAlive());
    testThread.start();

    System.out.println("this is the testThread after starting"+testThread.getState());
    System.out.println("thread is alive " + testThread.isAlive());

}

在runnable类中,我打算使用System.exit(1)或(0)。我也确实让它抛出一个错误,但仍显示线程的RUNNABLE状态。

public class JobThatImplementsRunnableJob implements Runnable {
    public void run() {
        System.exit(1);
        //System.exit(0);
        //throws Error
    }

}

以下是控制台输出

this is the testThread NEW
thread is alive false
this is the testThread after startingRUNNABLE
thread is alive true

我希望上面的信息足够了,谢谢你的建议。

4 个答案:

答案 0 :(得分:1)

当运行main的最后两个Sysouts时,线程实际上是活动的。你需要在主线程中进行睡眠。可能是5秒。

答案 1 :(得分:1)

作为Philip Voronov 极客答案的组合: 您正在寻找的代码是这样的:

public class fun {

    public static void main(String args[]) throws Exception {
        Runnable runnableJob = new JobThatImplementsRunnableJob();
        Thread testThread  = new Thread(runnableJob);

        System.out.println("this is the testThread "+ testThread.getState());
        System.out.println("thread is alive " + testThread.isAlive());
        testThread.start();
        testThread.join();
        System.out.println("this is the testThread after starting "+ testThread.getState());
        System.out.println("thread is alive " + testThread.isAlive());
    }
}

class JobThatImplementsRunnableJob implements Runnable {
    public void run() {
         return;
    }
}

这是我得到的输出:

this is the testThread NEW
thread is alive false
this is the testThread after starting TERMINATED
thread is alive false

答案 2 :(得分:0)

System.exit()不会杀死一个线程,它会杀死你的应用程序(它是一个 sys 调用,它处理整个应用程序,而不是java线程级别的内部java调用)。

在你的情况下,线程的System.exit()似乎在第二次检查线程后执行(记住它并行运行)。

答案 3 :(得分:0)

线程不会立即开始(实际上Java中没有任何事情立即发生)

检查线程的状态时,它可能实际上没有启动,也没有调用System.exit(1)。如果它有你不会得到输出,因为它会杀死整个过程。

我没有考虑获取线程的结果,而是建议将任务提交给ExecutorService。 e.g。

Future<String> future = executorService.submit(() -> {
    return "Success";
});

String result = future.get();

将更多作业提交到线程池并收集结果的更简单方法是使用parallelStream

List<Result> results = list.parallelStream()
                           .map(e -> process(e)) // run on all the CPUs
                           .collect(Collectors.toList());