当前位置: 首页 > 面试题库 >

有效使用UncaughtExceptionHandler

毕富
2023-03-14
问题内容

我最近了解了Java 1.5功能,并开发了一个示例代码来使用它。我的目标是在线程由于未捕获的异常而死亡时重新启动线程。

public class ThreadManager {

    public static void main(String[] args) throws InterruptedException {
        startThread();
    }

    public static void startThread(){
        FileReaderThread reader = new FileReaderThread("C:\\Test.txt");
        Thread thread = new Thread(reader);
        thread.setUncaughtExceptionHandler(new CustomExceptionHandler());
        thread.start();
    }
}

在这里,文件阅读器仅包含用于读取文件和打印内容的例程。我通过使该类内的文件名为空来模拟未捕获的异常。

然后,我的CustomExceptionHandler类如下。

public class CustomExceptionHandler implements Thread.UncaughtExceptionHandler {

    public void uncaughtException(Thread t, Throwable e) {
        ThreadManager.startThread();
    }
}

但是在这里我发现了一个问题。在未捕获的异常之后,线程处于睡眠状态。我通过使用探查器进行了验证。因此,创建新线程会随着时间的流逝而占用我的内存。使system.gc()后跟at
= null无效。

那么,您建议应对这种情况的最佳方法是什么?我只需要一个新线程,就不再需要任何旧线程…。

谢谢


问题答案:

我建议的方法是不要让异常从线程泄漏出去。未捕获的异常处理程序是一个漂亮的工具,但是,如果您使用它来确保线程正在运行,我建议您遇到设计或代码问题。您的线程快要死了,而只是忽略了这一点,而重新启动一个新线程可能就不是您想要做的,即使您能够弄清睡眠线程的问题。

想象一下,而不是线程中的问题出在您的main()方法上-
您是否会让同一异常一直泄漏出去并杀死您的应用程序?如果没有,您将如何缓解该问题?您不会编写main()再次调用的异常处理程序,对吗?无论您做什么,这都是您应该在线程中执行的操作。



 类似资料:
  • 问题内容: 我有大量要搜索的小文件。我一直在寻找一个良好的事实上的多线程版本,但找不到任何东西。如何改善grep的用法?截至目前,我正在这样做: 问题答案: 如果在多核处理器上安装了xargs,则可以从以下内容中受益,以防万一有人感兴趣。 环境: 测试: 1.找到必要的文件,将它们通过管道传递到xargs,并告诉它执行8个实例。 2.找到必要的文件,将它们通过管道传递到xargs,并告诉它执行4个

  • 问题内容: 我必须处理一个很大的结果集(可能是数十万行,有时更多)。 不幸的是,它们需要一次全部检索(在启动时)。 我正在尝试通过使用尽可能少的内存来做到这一点。 通过查看SO,我发现使用可能是我想要的,但我仍然不太了解如何正确使用它们。 正在做一个从基光标或SScursor相同的(在内存使用的术语)? 我可以一排(或几排)从sscursor的行中“流化” 吗?如果是,这样做的最佳方法是什么? 问

  • 问题内容: 我想知道是否有可能在SAS中使用proc sql从宽有效地转换成长有效。 我知道proc换位比我在下面建议的方法要快得多。但是我的目标之一是避免存储转置表。 例如,假设我有table1作为 我想把它变成 我可以做到这一点; 选择id,’A’作为col1,A作为 来自table1的col2 , 其中A〜=“” 联合选择id,’B’作为col1,B作为 来自table1的col2 , 其中

  • 问题内容: 我希望在python3中以有效的方式使用该功能。我拥有的代码可以完成任务,但是速度太慢,因为我正在处理大型数据集。因此,只要有折衷,我的工作重点就是效率而不是优雅。这是我想做的玩具: 这使 如我所愿,但是花费的时间太长了。最快的方法是什么? 编辑:这是比该问题更集中和明确的问题,其解决方案与此类似。 问题答案: 用于执行查找: 为了避免没有有效密钥的情况,您可以通过 您还可以使用回答有

  • 产品用例——我们的产品有一个典型的用例,我们将有n个用户。每个用户将有n个工作流,每个工作流可以在任何时间运行(n次)。 我希望这是任何工作流产品的典型用例。 我可以使用域来区分用户吗(我的意思是说为每个用户创建一个域)? 我可以为每个用户创建一个WorkflowClient来服务他所有的工作流执行吗?或者对于每个请求,我需要创建一个工作流客户端吗?哪一个是推荐的方法? 创建工作对象以轮询任务列表

  • 问题内容: 我使用绑定框架已有一段时间了,我想知道您如何处理这种情况。 您的报纸有一些属性,例如 (字符串)标题 (布尔值)已发布 (日期)发布日期 在您看来,您拥有一份报纸列表,可以同时对其进行全部编辑。这意味着您可以在单个请求中更改所有newspape的标题或“已发布”的所有状态。 问题在于,当我们使用绑定框架时,​​您将有点像编辑数据库中的数据一样编辑报纸的数据…将每个值彼此独立地绑定到字段