【问题标题】:Java multithreading in CPU loadCPU负载中的Java多线程
【发布时间】:2013-02-26 14:21:22
【问题描述】:

运行多个 Java 线程的应用程序有点问题。 应用程序运行多个工作线程,这些线程不断查看输入队列,如果队列中有消息,它们会将它们拉出并处理它们。

在这些工作线程中,还有另一个验证线程计划在固定时间执行检查,以查看主机(运行应用程序的主机)是否仍处于运行应用程序的“良好状态”。该线程更新AtomicBoolean 值,然后工作线程在开始查看主机是否正常之前对其进行验证。

我的问题是,在 CPU 负载较高的情况下,负责验证的线程将花费更长的时间,因为它必须与所有其他线程竞争。如果AtomicBoolean 在一段时间后没有得到更新,它会自动设置为 false,从而给我造成严重的瓶颈。

我最初的方法是提高验证线程的优先级,但深入研究后我发现这不是保证行为,算法不应依赖线程优先级才能正常运行。

有人有其他想法吗?谢谢!

【问题讨论】:

  • 通常,优先级不应影响正常运行,但这似乎是一个调整问题。假设验证线程的 CPU 负载较低,并且工作人员需要更多的 CPU,则给他们较低的优先级。另外,请确保您的 atomic 的超时时间没有设置得太低。
  • 再次:向我们展示您的verification thread 的源代码。

标签: java multithreading thread-priority


【解决方案1】:

使用 java.util.concurrent 包的 LinkedBlockingQueue 代替查看常规队列数据结构。

您可以做的是,运行一个线程池(您可以使用执行器服务的固定线程池,即您选择的多个工作线程)并执行 LinkedBlockingQueue.take()。

如果消息到达队列,则将其馈送到等待线程之一(是的,take 确实会阻塞线程,直到有东西要馈送为止)。

Java API Reference for Linked Blocking Queue's take method

HTH。

【讨论】:

  • 第二。不要只是在您的工作线程中旋转和窥视,当无事可做时,让它们等待()锁定或阻塞队列。很可能是您的过度活跃的工作线程正在扼杀响应能力。正确地做。
【解决方案2】:

一种限制工作速率的老派方法,根本不使用运行状况检查线程(因此绕过这些问题),如果队列比说的长,则阻止或拒绝添加到队列的请求100. 这会对产生负载的客户端施加动态背压,从而在工作线程过载时减慢它们的速度。

此方法已添加到 Java 1.5 库中,请参阅 java.util.concurrent.ArrayBlockingQueue。如果队列已满,它的 put(o) 方法会阻塞。

【讨论】:

  • 很遗憾我无法触摸队列,因为它们在限制范围内
【解决方案3】:

您是否使用 Executor 框架(来自 Java 的并发包)?如果不试一试。您可以尝试使用 ScheduledExecutorService 作为验证线程。

【讨论】:

  • 我实际上正在使用 ScheduledThreadPoolExecutor 作为验证线程。其他线程也使用 ScheduledThreadPoolExecutor 创建,但在不同的池中。这些线程执行的作业有一个while循环,因此它们可以连续执行。也许我错过了什么。
【解决方案4】:

更多线程并不意味着更好的性能。通常如果你有双核,2 线程提供最好的性能,3 或更多开始变得更糟。四核应该最好处理 4 个线程,等等。所以要小心你使用了多少线程。

您可以在其他线程执行完工作后让它们进入睡眠状态,并允许其他线程完成它们的工作。我相信 Thread.yield() 会暂停当前线程给其他线程时间。

如果您希望您的线程连续运行,我建议创建两个主线程,线程 A 和 B。使用 A 作为验证线程,并从 B 创建其他线程。因此线程 A 获得了更多的执行时间。

【讨论】:

  • 我认为默认情况下,线程获取创建它的线程的优先级,因此在您描述的使用线程 B 创建的线程的情况下,将具有与线程 A 相同的优先级。请纠正我,如果我我错了
  • 可能是,我不确定,但我在这里要说的是,你一直在线程 A 和 B 之间切换。B 将需要运行多个线程,而 A 将是单个线程,因此 A 将获得更多时间。优先级,我并不是指线程优先级,我的意思是它将有更多的执行时间。让我更正一下,让它更清楚。
【解决方案5】:

看来您需要使用 Condition 变量。窥视将占用 CPU 周期。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/Condition.html

【讨论】:

    猜你喜欢
    • 2023-01-31
    • 2021-03-15
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多