在Exception上运行多个线程和Stop线程

时间:2016-07-19 12:24:31

标签: java multithreading

我有一个Thread(实现Runnable)来自许多分支人员用它们的分支代码调用该线程。我用分支代码设置了他们的线程名称。 问题是......

  1. 当运行线程发生异常时 - 我无法阻止它。当尝试使用任何名称“ExceptionInInitializerError”或“OutOfMemoryError:Java堆空间”创建另一个线程时
  2. “OutOfMemoryError:Java堆空间”异常在一次运行2个或更多线程时出现。
  3.  
    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();
            }
        }
    }
    

1 个答案:

答案 0 :(得分:1)

你在这里面临多个问题:

  1. 您无法加入线程本身。 Thread.join()等待线程死亡。但是如果你从想要停止的线程中调用它,它就会永远等待。

  2. 要停止线程,您只需从其run()方法返回即可。在您的情况下,只需在catch子句中添加return,而不是调用closeThread()

  3. 您似乎遇到了一些内存问题。无论你在exportCorner()中做了什么,都会使用很多内存,或者你同时创建多个线程。正如Andy Turner在评论中提到的那样,使用ExecutorService处理Runnable可能会很有用。这可以帮助您管理线程并确保有限的线程数。