【问题标题】:Why does Quartz.NET create threads with the same thread id?为什么 Quartz.NET 创建具有相同线程 ID 的线程?
【发布时间】:2015-04-18 02:21:45
【问题描述】:

我已将 Quartz.NET 设置为运行计划作业。当我查看线程 ID 时,这真是太神奇了。它们只是在 10 线程间隔内重复。

我的意思是,例如,如果第一个执行我的作业的线程的 ID 为 101,那么第十一个线程(在第十一个间隔运行相同的作业)具有相同的 ID,101!

看起来 Quartz.NET 使用的是 10 个线程的池,但更神奇的是:为什么线程的 ID 相同?他们不应该在每次创建时都获得新的线程 ID 吗?

【问题讨论】:

    标签: .net multithreading quartz.net


    【解决方案1】:

    这是因为 Quartz.NET 中的默认调度程序是 DirectSchedulerFactory,它使用内部线程池实现 (SimpleThreadPool)。

    这将设置固定数量的线程,并为作业重用相同的线程。这会阻止您为每个作业获取新的线程 ID,因为线程 != 作业。

    【讨论】:

      【解决方案2】:

      您还没有回答自己的问题吗?我对石英知之甚少,但如果它使用线程池,那么,是的,它将重用线程。启动线程的高成本是线程池解决的问题之一,因此通过重用现有线程来避免这种成本(即每次处理工作请求时都不会启动新线程)

      【讨论】:

      • 你是说线程实际上并没有被回收,而是在quartz.net中被重复使用?线程本地存储怎么样?每次都重置/清除吗?我们可以强制它重置吗?
      • 啊。在我看来,recycled==reused,所以也许这会引起混乱。至于您的第二点:您提供了一种安排的方法。方法执行。完成后,当地人会超出范围。任务完成。线程进入睡眠状态,当更多工作到达时被唤醒。 en.wikipedia.org/wiki/Thread_pool_pattern
      猜你喜欢
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2021-05-23
      • 1970-01-01
      • 2014-03-20
      相关资源
      最近更新 更多