项目中每小时调度启动Thread后,是否需要手动停止该线程?
关于线程是否需要手动停止的解答
首先给你吃个定心丸:你完全不需要手动停止这些线程。原因很简单:
你的
Runnable任务(也就是MyClass的run()方法)是一次性执行逻辑——从服务器获取文件、存储到数据库,当这段代码执行完毕后,run()方法会自然结束,对应的线程也会自动进入终止状态,根本不需要额外调用停止方法(而且像Thread.stop()这类方法早就被Java官方废弃了,因为会引发线程状态不一致的安全问题)。你当前的代码逻辑是每小时创建新线程启动任务,线程完成任务后就会自动“消亡”,不会一直占用系统资源。不过这里有个小优化建议:如果某次任务执行时间意外超过一小时(比如服务器响应慢、文件过大),调度器再次启动新线程可能会导致多个线程同时执行任务,若你想避免这种资源竞争情况,可以改用单线程线程池,比如
Executors.newSingleThreadExecutor(),这样同一时间只会有一个线程在运行,后续任务会排队等待,更稳妥。
给你个简单的线程池改造示例:
// 全局只需要初始化一次的单线程线程池 ExecutorService taskExecutor = Executors.newSingleThreadExecutor(); // 调度器触发时提交任务 try { taskExecutor.submit(new MyClass()); } catch (Exception ex) { System.err.println("Exception-Thread: " + ex.getMessage()); } // 注意:应用关闭时记得调用下面的方法关闭线程池,避免资源泄漏 // taskExecutor.shutdown();
最后再提醒一句:永远不要使用Thread.stop()、Thread.suspend()这类废弃方法,它们会让线程处于不稳定状态,引发各种难以排查的bug。你的场景是一次性任务,完全不需要额外的终止操作,放心用就好。
内容的提问来源于stack exchange,提问作者Mihawk
相关产品推荐
相关产品推荐

