如何使线程崩溃或故意挂起线程?
How to crash a thread or intentionally hung the thread?
只是想知道如何在崩溃后检查线程状态。到目前为止,我做了一些 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());
}
在可运行的 class 中,我有意使用 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
希望上面的信息足够了,谢谢你的建议。
当main的最后两个Sysout为运行时,线程才真正存活。您需要在主线程中休眠。可能是5秒。
System.exit()
不会终止线程,它会终止您的应用程序(这是一个 sys 调用,它处理整个应用程序,而不是内部 java 在 java 线程级别调用)。
在您的情况下,线程的 System.exit()
似乎是在您对线程进行第二次检查后执行的(记住它是并行运行的)。
线程不会立即启动(实际上在 Java 中不会立即发生任何事情)
当您检查线程的状态时,它可能实际上还没有启动,也没有调用 System.exit(1)。如果它有你不会得到输出,因为它会杀死整个过程。
与其考虑获取线程的结果,我建议将任务提交给 ExecutorService。例如
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());
作为 Philip Voronov 和 Geek 答案的组合:
您要找的代码是这样的:
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
只是想知道如何在崩溃后检查线程状态。到目前为止,我做了一些 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());
}
在可运行的 class 中,我有意使用 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
希望上面的信息足够了,谢谢你的建议。
当main的最后两个Sysout为运行时,线程才真正存活。您需要在主线程中休眠。可能是5秒。
System.exit()
不会终止线程,它会终止您的应用程序(这是一个 sys 调用,它处理整个应用程序,而不是内部 java 在 java 线程级别调用)。
在您的情况下,线程的 System.exit()
似乎是在您对线程进行第二次检查后执行的(记住它是并行运行的)。
线程不会立即启动(实际上在 Java 中不会立即发生任何事情)
当您检查线程的状态时,它可能实际上还没有启动,也没有调用 System.exit(1)。如果它有你不会得到输出,因为它会杀死整个过程。
与其考虑获取线程的结果,我建议将任务提交给 ExecutorService。例如
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());
作为 Philip Voronov 和 Geek 答案的组合: 您要找的代码是这样的:
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