【问题标题】:Terminate a Thread in Java在 Java 中终止线程
【发布时间】:2015-12-21 03:14:01
【问题描述】:

首先:抱歉这个问题!

考虑一个普通的基本 Java 程序:

public class TestClass {
    public static void main(String[] args) {

        Thread t=new Thread()
        {
            public boolean isRunning;
            public void run()
            {
                while(isRunning);
            }
        }
        t.isRunning=true;
        t.start();
        t=null;
    }
}

线程会永远运行,不是吗?

当我像上面的代码一样不小心将线程设置为 null 时,我将如何停止它?或者如果由于某种原因 Thread 对象被无效会发生什么?

基本上程序的行为如何?我可以以某种方式查询一个正在运行的线程而不引用它,而我只是以某种方式停止()它吗?

现在,当 Thread 对象还包含一些需要并将在 run 方法中使用的数据时呢?它们是 null 还是仍然可以访问?

如果是这样,那么再次获取对象的引用真的很重要

编辑:我在问题中添加了一个 android 标签。我更多地考虑Android环境。应用程序的进程可以很容易地被杀死,并且事情可能会出错以至于线程被取消但它的执行仍在继续,因此再次获取线程的引用很重要。就像当一个活动被系统杀死时,它对线程的引用也消失了。因此,在发生内存泄漏之前,我必须采取一些措施来防止在启动另一个线程之前有一个正在进行的线程

【问题讨论】:

  • 您是否阅读过有关线程的文档?大部分内容都在那里:docs.oracle.com/javase/tutorial/essential/concurrency/…
  • 是的,我不是 Java 新手,但这是我不知道的:如何获取对我意外无效的线程的引用
  • 你的意思是如何列出我猜的所有线程
  • @IljaKO 你可能想错了:不小心取消了不应该出现的东西是一个错误(一个大的线程最终会永远运行)。使用调试器并检查引用在哪里/为什么会得到很多。如果需要,使用弱引用。只是不要试图用更多的错误代码来隐藏你的错误。
  • 是的,我当然知道这是一个错误,应该避免。但是,例如,如果 RAM 上发生了某些事情,我希望我的程序能够意识到这一点。因此,当我的线程有一些我需要的数据时

标签: java android multithreading


【解决方案1】:

这就是线程泄漏的情况。如果你继续这样做(即开始一个线程并忘记它)很快你就会得到java.lang.OutOfMemoryError: Unable to create new native thread异常。

您应该始终使用受控线程池(如 ExecutorService)并在 finally 子句中将其关闭,或使用 Runtime.getRuntime().addShutdownHook 注册关闭挂钩以关闭线程池/线程

【讨论】:

    猜你喜欢
    • 2014-11-18
    • 2012-08-28
    • 2011-08-11
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多