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

Java多线程问题

通博实
2023-03-14

1):单线程应用程序只会在用户的CPU上使用1个线程吗?提供更多的线程会使用多个CPU内核吗?如果声明的线程比用户的CPU多,会发生什么?

共有1个答案

赵昊阳
2023-03-14

你问的问题:

  1. 是的,一个线程意味着一个CPU线程。附加线程可以使用附加CPU,只要它们有工作要做。如果您创建的线程比CPU多,它们就会争夺CPU时间,结果通常会更慢。一些CPU使用超线程,公开的线程比实际内核多(有时这会提高性能)。使用runtime.getruntime.availableProcessors()显示建议的线程计数。
  2. 是的,线程的创建和销毁并不便宜,每个线程都有很大的开销。由于这个原因,池化和重用线程是一种极其常见的模式。不要为每个方法调用创建线程。
  3. 垃圾收集器已经在单独的线程中完成了它的工作,但是它必须在至少一部分GC中引起“停止世界”暂停,以便标记死的对象进行收集。

你需要的问题和答案,对你没有问的问题:

    null

编辑:在有人抱怨之前,异步I/O或非阻塞I/O比线程池在网络请求方面表现得更好,但对于新开发人员来说,正确使用它们也更加复杂。只要您不在网络上写大量的东西,一个适度大小的线程池就足以饱和网络连接,尽管有延迟。

如果出现明显的垃圾收集暂停,那么您可能做错了什么。对垃圾收集进行了优化,以便在最少的时间内获得最多的结果。大多数情况下,GC暂停时间为几毫秒,以完成一个较小的GC(除非我们讨论的是4+GB的堆)。不要显式调用system.gc(),否则将强制执行不必要的工作和一个大的stalt-the-world暂停。

 类似资料:
  • 如图所示, 位置 2 和位置3 为什么可以访问 位置1 (也就是主线程)的 point 局部变量 ? 毕竟 位置 2 和位置3 是另外两个线程啊 !! 当我加上 第10行代码后,thread1 和 thead2 中都不能访问主线程中的point 了。我知道这是内部类的“事实最终变量” 的限制。 如下图所示,就是我不理解的地方。(在 “栈内存” 层面) 我的猜测:之所以 thread1 和 trea

  • 教程这样说道:“内部调用了this.notifyAll()而不是this.notify(),使用notifyAll()将唤醒所有当前正在this锁等待的线程,而notify()只会唤醒其中一个(具体哪个依赖操作系统,有一定的随机性)。这是因为可能有多个线程正在getTask()方法内部的wait()中等待” 。 我有点疑惑的一句话是 “可能有多个线程正在getTask()方法内部的wait()中等

  • 我有一个应用程序,它有一个ConcurrentHashMap本地存储一个存储在外部服务器上的数据副本。地图每隔几秒钟就会更新一次数据的新副本。 我有一个循环,每隔几秒钟运行一次,它可以访问HashMap并按照值的顺序将元素添加到数组中(实际上它做的事情还多一些,但这并不相关)。我的问题是,如果数据在创建数组的过程中发生了变化,您可能会在不同的地方有重复的键,或者完全省略一些键。 示例: 如您所见,

  • 前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的。这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。 这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有;可能有些问题对应的答案也有;也可能有些各位网友也都看过。但是本文写作的重心就是所

  • 线程2:4 . . 线程3:7 线程3:8 线程1:9 这是我为正在执行线程的类编写的代码 我认为问题在于NumberEntry对象的创建。但我不太确定怎么修好它。如果有人能以任何方式帮助我,那就太好了:)。

  • 互斥锁 互斥锁的本质是当一个 goroutine 访问的时候,其它 goroutine 都不能访问 这样就能实现资源同步,但是在避免资源竞争的同时也降低了程序的并发性能,程序由原来的并发执行变成了串行 案例 有一个打印函数, 用于逐个打印字符串中的字符,有两个人都开启了goroutine去打印 如果没有添加互斥锁,那么两个人都有机会输出自己的内容 如果添加了互斥锁,那么会先输出某一个的,输出完毕之