当前位置: 首页 > 知识库问答 >
问题:

执行时间长的线程是否需要使用线程池

戚修雅
2023-03-14

需要检测两个对象的状态,并且任务需要实时。run方法使用while(flag)循环通过更改flag=false来结束线程的生命周期。线程通常需要运行40分钟或更长时间。使用线程池将导致核心线程池耗尽,而任务将进入队列,因为每个线程将运行40分钟,每个线程的执行时间非常长且不固定,因此必须有许多线程无法及时响应。

我尝试使用新线程(runnable)。Start()而不是使用线程池ThreadPoolExecutor。execute(runnable),但我认为,通过这种方式,虽然我将在并发HashMap中缓存runnable,但我总是觉得线程不是由线程池管理的,并且可能存在异常(例如无故消失)。

如何解决这个问题,或者用什么更好的方法来代替while(flag)的写入。

谢谢你的建议,谢谢!!!!!

共有1个答案

梁丘兴腾
2023-03-14

使用线程池将导致核心线程池耗尽,任务将进入队列,

如果您使用Executors.newCachedThreadPool(),如果一个线程不可用,将立即创建一个新线程。作业运行的时间量无关紧要。

我总是觉得线程不是由线程池管理的,可能会有例外(比如无缘无故地消失)。

您当然可以将线程的主要处理主体放在<代码>尝试{…}捕获(异常e){…} 阻止–如果需要,您甚至可以执行catchThrowable。当您提交(…)时 作业到线程池,这就是它保护线程免受异常影响的方法。

通过更改标志=false结束线程的生命周期

此标志应为volatile,否则将看不到线程之间的更改。

 类似资料:
  • 问题内容: 我决定使自己熟悉node.js,并阅读有关该主题的几篇文章。我仍然不清楚的是,当您调用node.js函数时,node.js是否在线程池中创建新线程和/或在线程上调度任务。 例如,如果我调用它是否在其他线程上执行? 如果是,[如何]我可以编写自己的函数或在其他线程上运行? 问题答案: 没有用于文件操作的异步API,因此node.js为此使用了线程池。您可以在libuv的代码中看到它。 该

  • 我搜索了关于测量Java应用程序执行时间的信息,得到了以下代码: 开始和停止之间的差异给了我执行时间。 注意:我知道这不是确切的执行时间。我只是需要多线程和单线程应用程序之间的比较的时间。 如果我这样更改代码会怎样: 执行10个线程。不管他们做什么。假设他们随机填充一个二维数组。 现在,stop-start给了我“全部”执行时间?或者我必须自己测量线程吗?

  • 问题内容: 我只是想知道我们是否真的需要算法是多线程的,如果它必须利用多核处理器,或者jvm是否要利用多核处理器,即使我们的算法是顺序的? 问题答案: 我不相信任何当前的生产JVM实现都可以执行自动多线程。他们可能会使用其他核心进行垃圾回收和其他内部管理,但是如果您的代码是顺序表达的,则很难自动并行化它并仍然保留精确的语义。 有 可能 是一些实验/研究的JVM其中设法并行的代码的JIT可以当场为尴

  • 问题内容: 我对多线程是否可以在Python中工作感到有些困惑。 我知道对此有很多疑问,我已经阅读了很多,但是我仍然很困惑。我从自己的经验中知道,并且看到其他人在StackOverflow上发表了自己的答案和示例,说在Python中确实可以实现多线程。那么为什么每个人都说Python被GIL锁定并且一次只能运行一个线程呢?显然可以。还是我不来这里有什么区别? 许多张贴者/受访者还不断提到线程是有限

  • 获取宝石元数据和完整的源索引需要非常长的时间。我使用的是最新的bundler。 > 有没有办法在笔记本电脑中的多个用户或整个局域网中共享这些信息。 有什么机制可以使它运行得更快。 bundle安装 从中获取gem元数据https://rubygems.org/. 请求依赖项API时出现错误Bundler::HTTPError 从https://rubygems.org/获取完整的源索引 使用耙(1

  • 我确信这两个列表都不是空的,并且正在调用,但是没有调用order execution run方法....