Java 运行多线程并在异常时停止线程
我有一个来自许多分支官员的线程(实现Runnable),用分支代码调用该线程。我用分支代码设置了他们线程的名称。 问题是Java 运行多线程并在异常时停止线程,java,multithreading,Java,Multithreading,我有一个来自许多分支官员的线程(实现Runnable),用分支代码调用该线程。我用分支代码设置了他们线程的名称。 问题是 当运行线程时发生异常-我无法停止。当尝试创建另一个名为“ExceptionInInitializeError”或“OutOfMemoryError:Java堆空间”的线程时 “OutOfMemoryError:Java堆空间”异常在一次运行两个或多个线程时出现 线程类在这里 public class Exporter implements Runnable{ priv
public class Exporter implements Runnable{
private String branchCode;
public Exporter(String branchCode){
this.branchCode = branchCode;
}
@Override
public void run() {
try {
exportCorner();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void exportCorner() throws InterruptedException{
try{
//Some Process
}catch(Exception e){
// I want to close running thread here
// I am using closeThread(this.branchCode), but not working
}
}
static void closeThread(String branchCode) throws InterruptedException {
Thread thread = null;
for (Thread t : Thread.getAllStackTraces().keySet()) {
if (t.getName().equals(branchCode))
thread = t;
}
if (thread != null) {
thread.interrupt();
thread.join();
}
}
}
您在这里面临多个问题:
run()
方法返回即可。在您的情况下,只需在catch子句中添加return
,而不是调用closeThread()
exportCorner()
中执行的任何操作都会占用大量内存,或者一次创建多个线程。正如Andy Turner在评论中提到的,使用一个函数来处理您的可运行的s可能是有用的。这可以帮助您管理线程并确保有限的线程数
我不知道你在问什么。如果一个异常发生在线程的run方法中,那么它就会死掉(除非一个人正在实现某种无休止的循环,它只会吃掉异常而不是对异常做出反应)。换句话说:如果线程运行遇到异常,只需确保您的代码从该方法“返回”(例如在记录异常后),并且您应该是正确的。可能会重复使用
ExecutorService
,并取消提交任务时返回的未来
。另外,您可以使用Callable
而不是Runnable
,它的call()
方法允许您抛出已检查的异常,而不是显式地处理它们。只需按您所做的方式捕获异常,以您想要的方式处理它(写入日志,在控制台中打印),然后释放它。当线程到达其代码末尾时,线程将自动终止。另外:您认为为什么需要调用closeThread
?您知道哪个线程运行的是this.branchCode
-它是thread.currentThread()
(除非您为同一个分支代码启动多个线程,即..yikes);有效地调用Thread.currentThread().join()
是愚蠢的(它阻塞当前线程,等待当前线程完成)。
public class Exporter implements Runnable{
private String branchCode;
public Exporter(String branchCode){
this.branchCode = branchCode;
}
@Override
public void run() {
try {
exportCorner();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void exportCorner() throws InterruptedException{
try{
//Some Process
}catch(Exception e){
// I want to close running thread here
// I am using closeThread(this.branchCode), but not working
}
}
static void closeThread(String branchCode) throws InterruptedException {
Thread thread = null;
for (Thread t : Thread.getAllStackTraces().keySet()) {
if (t.getName().equals(branchCode))
thread = t;
}
if (thread != null) {
thread.interrupt();
thread.join();
}
}
}