【问题标题】:Is it necessary to use thread pool for threads with long execution time执行时间长的线程是否需要使用线程池
【发布时间】:2021-06-16 11:46:46
【问题描述】:

需要检测两个对象的状态,任务需要是实时的。 run方法使用while(flag)循环,通过改变flag = false来结束线程的生命周期。线程通常需要运行 40 分钟或更长时间。使用线程池会导致核心线程池用完,任务进入队列,因为每个线程要运行40分钟每个线程的执行时间很长而且不固定,所以肯定有很多线程无法及时回复。

我尝试使用新线程(可运行)。 start() 而不是使用线程池ThreadPoolExecutor.execute(runnable),但是我觉得这样,虽然我会在一个并发的HashMap中缓存runnable,但是我总觉得线程不是由线程池管理的,可能会出现异常(比如无故消失)。

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

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

【问题讨论】:

  • 自己缓存东西通常是内存泄漏的前兆......如果你不把东西从HashMap中删除,那么那些Runnable仍然引用的任何对象都不能被GC'd如果您仍然持有 HM.. Executor 是正交问题
  • 这 40 分钟发生了什么 - 如果您正在等待结果,可能有比分配线程和等待更好的方法 - 请参阅 stackoverflow.com/questions/14541975/… 获取一些示例/讨论。因为如果你需要处理这 40 分钟中的 100 倍,那么“线程池耗尽”甚至“线程耗尽”是你必须设计的。

标签: java multithreading threadpool


【解决方案1】:

使用线程池会导致核心线程池用完,任务进入队列,

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

总觉得线程不是由线程池管理的,可能会出现异常(比如无缘无故消失)。

如果您担心虚假异常,您当然可以将线程的主要处理主体放在try { ... } catch (Exception e) { ... } 块中——如果需要,您甚至可以捕获Throwable。当您 submit(...) 作业到线程池时,这就是保护线程免受异常影响的作用。

通过改变flag = false来结束线程的生命周期

这个标志应该是volatile,否则线程之间的变化不会被看到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2011-04-15
    • 2015-09-05
    • 1970-01-01
    相关资源
    最近更新 更多