Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 运行多线程并在异常时停止线程_Java_Multithreading - Fatal编程技术网

Java 运行多线程并在异常时停止线程

Java 运行多线程并在异常时停止线程,java,multithreading,Java,Multithreading,我有一个来自许多分支官员的线程(实现Runnable),用分支代码调用该线程。我用分支代码设置了他们线程的名称。 问题是 当运行线程时发生异常-我无法停止。当尝试创建另一个名为“ExceptionInInitializeError”或“OutOfMemoryError:Java堆空间”的线程时 “OutOfMemoryError:Java堆空间”异常在一次运行两个或多个线程时出现 线程类在这里 public class Exporter implements Runnable{ priv

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

  • 当运行线程时发生异常-我无法停止。当尝试创建另一个名为“ExceptionInInitializeError”或“OutOfMemoryError:Java堆空间”的线程时
  • “OutOfMemoryError:Java堆空间”异常在一次运行两个或多个线程时出现 线程类在这里

    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();
            }
        }
    }