我有一个Thread(实现Runnable)来自许多分支人员用它们的分支代码调用该线程。我用分支代码设置了他们的线程名称。 问题是......
public MyRunnerClass {
//This method called from many branch with their branch Code
public void executeBranchProcess(String branchCode){
Thread t = new Thread(new Exporter(branchCode);
t.setName(branchCode);
t.start();
}
}
此处的线程类
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();
}
}
}
答案 0 :(得分:1)
你在这里面临多个问题:
您无法加入线程本身。 Thread.join()等待线程死亡。但是如果你从想要停止的线程中调用它,它就会永远等待。
要停止线程,您只需从其run()
方法返回即可。在您的情况下,只需在catch子句中添加return
,而不是调用closeThread()
。
您似乎遇到了一些内存问题。无论你在exportCorner()
中做了什么,都会使用很多内存,或者你同时创建多个线程。正如Andy Turner在评论中提到的那样,使用ExecutorService处理Runnable
可能会很有用。这可以帮助您管理线程并确保有限的线程数。