相关疑难解决方法(0)

如果CPU是超线程,是否可以检查Java?

我想知道我可以运行的最佳线程数.通常,这等于Runtime.getRuntime().availableProcessors().

但是,在支持超线程的CPU上,返回的数字是两倍.现在,对于某些任务,超线程是好的,但对于其他任务,它什么都不做.在我的情况下,我怀疑,它什么也没做,所以我想知道我是否必须将返回的数字除以Runtime.getRuntime().availableProcessors()二.

为此,我必须推断CPU是否是超线程.因此我的问题 - 我怎么能用Java做到这一点?

谢谢.

编辑

好的,我已对我的代码进行了基准测试.这是我的环境:

  • 联想ThinkPad W510(即带有4核和超线程的i7 CPU),16G内存
  • Windows 7的
  • 84个压缩的CSV文件,压缩大小从105M到16M不等
  • 所有文件都在主线程中逐个读取 - 没有多线程访问HD.
  • 每个CSV文件行包含一些数据,这些数据被解析,快速无上下文测试确定该行是否相关.
  • 每个相关的行包含两个双精度表示(好奇的经度和纬度),它们被强制转换为单个Long,然后存储在共享散列集中.

因此,工作线程不会从HD中读取任何内容,但是它们会通过解压缩和解析内容来占用自己(使用opencsv库).

下面是代码,没有枯燥的细节:

public void work(File dir) throws IOException, InterruptedException {
  Set<Long> allCoordinates = Collections.newSetFromMap(new ConcurrentHashMap<Long, Boolean>());
  int n = 6;
  // NO WAITING QUEUE !
  ThreadPoolExecutor exec = new ThreadPoolExecutor(n, n, 0L, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>());
  StopWatch sw1 = new StopWatch();
  StopWatch sw2 = new StopWatch();
  sw1.start();
  sw2.start();
  sw2.suspend();
  for (WorkItem wi : m_workItems) …
Run Code Online (Sandbox Code Playgroud)

java multithreading hyperthreading

21
推荐指数
2
解决办法
5617
查看次数

在JVM中,Thread对象是直接绑定到CPU核心,还是介于两者之间?

我想知道的(以及我发现哪些文档对于解决它没有多大帮助),当CPU核心在其上执行时将控制转移到硬件设备(磁盘控制器,网络I /)时会发生什么?哦,...)做一些CPU /核心无法帮助的东西.该核心是否可用于执行其他线程,或者只是停止并等待(即使有其他具有CPU工作的线程可用于调度)?

"尽可能多的线程作为核心"的常见建议似乎暗示了后者.

java multithreading

6
推荐指数
1
解决办法
391
查看次数

标签 统计

java ×2

multithreading ×2

hyperthreading ×1