gpt4 book ai didi

Java 多线程问题

转载 作者:行者123 更新时间:2023-11-30 06:10:22 24 4
gpt4 key购买 nike

1): 单线程应用程序是否只会在用户的 CPU 上使用 1 个线程?给更多的线程会使用多个 CPU 内核吗?如果您声明的线程多于用户的 CPU 拥有的线程,会发生什么情况?

2):只要您的方法不存在同步问题等,为每个方法创建新线程是否会对性能造成损害?

3):我在做游戏,偶尔在收垃圾的时候会出现明显的卡顿。将垃圾收集器放在它自己的线程中会解决这个问题吗?

最佳答案

您确实提出的问题:

  1. 是的,一个线程意味着一个 CPU 线程。额外的线程可以使用额外的 CPU,只要它们有工作要做。如果您创建的线程多于 CPU,它们将争夺 CPU 时间,结果通常会变慢。一些 CPU 使用超线程并公开比实际内核更多的线程(有时这会带来性能优势)。使用 Runtime.getRuntime.availableProcessors() 显示建议的线程数。
  2. 是的,创建和销毁线程并不便宜,并且有一个 large overhead for each thread .出于这个原因,池化和重用线程是一种极其常见的模式。不要为每个方法调用创建一个线程。
  3. 垃圾收集器已经在单独的线程中完成它的工作,但它必须为至少部分 GC 造成“停止世界”暂停,以便标记要收集的死对象。

您需要的问题和答案,针对您没有提出的问题:

问:我怎样才能让它运行得更快?

答:几种方式:

  • 简介:找出程序中的瓶颈所在,并专注于此。 10% 的代码通常会占用 90% 的运行时间。
  • 在尝试优化实现之前先关注算法。唯一比以快 2 倍的速度执行昂贵的操作更好的是永远不必这样做。延迟加载和缓存结果可以节省大量时间。
  • 使用一个主线程进行渲染和用户交互,并尽可能少地在此处执行实际工作。这使系统看起来对用户有响应。渲染应该只在发生变化时创建新对象。
  • 对长时间运行的任务使用工作队列和工作线程池,尤其是会阻塞渲染和 UI 线程的网络请求或磁盘 I/O。您所有的实际工作都应该是异步的。
  • 尽可能少地产生垃圾 - 不要在不需要时制造和销毁对象。垃圾回收应该很少成为 Java 程序的重大瓶颈。
  • 对磁盘 I/O 使用单个线程,对网络 I/O 使用池中的多个线程,每个 CPU 使用一个工作线程。

编辑:在有人提示之前,异步 I/O 或非阻塞 I/O 对于网络请求比线程池执行得更好,但对于新开发人员来说正确使用它们也更复杂。只要您不编写繁重的网络内容,中等大小的线程池就足以使网络连接饱和,尽管存在延迟。

如果您遇到明显的垃圾收集暂停,那么您可能做错了什么。垃圾收集经过优化,可以用最少的时间获得最多的结果。大多数时候,GC 暂停将是几毫秒以执行次要 GC(除非我们谈论的是 4+ GB 的堆)。 不要显式调用 System.gc(),否则您将强制执行不需要的工作和一个大的 halt-the-world 暂停。

关于Java 多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35878203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com