当前位置: 首页 > 面试题库 >

具有四核处理器的笔记本电脑中的Java多线程

常英纵
2023-03-14
问题内容

我正在阅读Java教程,其中提到在具有单个处理器的计算机中不会发生实际的多线程。它提到OS为Java进程分配了指定的时间量,并且JVM线程调度程序选择了用于在短时间内一次运行一个线程的线程。

我有一台笔记本电脑使用哪个四核处理器-
是否可以通过在每个核中运行一个线程来以编程方式更快地运行多线程程序?我之所以问这个问题,是因为书中提到只有一个真正的多处理器系统才能同时执行多项操作。


问题答案:

即使是单个CPU,也可以从松散的意义上“同时完成多项任务”,但是它们并不是真正并行的。您可以启动100个线程在单个内核上运行,它们将获得时间片,在每个时间片中它们可以运行一些指令,从而给人一种印象,即它们都在同一时间执行。

线程一词通常涵盖三个抽象层:

  1. 用户线程 是由应用程序启动的线程,并且被N:M映射到:
  2. 内核线程 (由操作系统管理的线程)将N:M映射到:
  3. 硬件线程 ,这是可用的实际物理资源。

Java线程是用户线程。CPU中的4个核心被视为硬件线程。由于跨层的映射是N:M,因此可以看到可以将多个用户线程映射到较少数量的硬件线程。

话虽如此,通常有两类线程活动,每种都有自己的怪癖:

  1. I / O线程 :这些线程大部分时间都在等待从流进行的读/写操作,并且在此期间被阻塞(它们没有计划执行,直到发生事件将其唤醒)。CPU上有指示灯,即使在单个内核上,它们中的许多也可以同时运行。
  2. 计算线程 :这些线程进行大量的数字运算,并最大程度地使用CPU。通常启动的线程数多于(可用内核数的2倍)会降低性能,因为CPU的功能单元数量有限:ALU,FPU等。

上面的第二类线程使您真正看到了好处,或者在四核CPU上运行了多线程Java程序。这是一个简单的程序示例,该程序先按顺序执行1.000.000.000数字的平方,然后使用具有4个线程的线程池并行执行

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

class ThreadTask implements Runnable {

    private int total = 0;

    public ThreadTask(int total) {
        this.total = total;
    }

    @Override
    public void run() {
        int value = 0;
        for(int i = 0; i < total; i++) {
            value = i * i;
        }
    }       
}

public class Test {

    public static void main(String[] args) throws InterruptedException {

        int total = 1000000000;

        long start = System.currentTimeMillis();
        long value = 0;
        for(int i = 0; i < total; i++) {
            value = i * i;
        }       
        long stop = System.currentTimeMillis();

        System.out.println((stop - start) + " ms");

        ExecutorService exec = Executors.newFixedThreadPool(4);
        start = System.currentTimeMillis();
        for(int i = 0; i < 4; i++) {
            exec.submit(new ThreadTask(total / 4));
        }
        exec.shutdown();
        exec.awaitTermination(10, TimeUnit.SECONDS);
        stop = System.currentTimeMillis();

        System.out.println((stop - start) + " ms");     
    }
}

total如果运行速度太快,请随意调整其值。现在,我正在与Intel Atom一起从事上网本的开发,因此速度并不是很快。



 类似资料:
  • 我想将IPython笔记本的宽度设置为2500px,并将其向左对齐。我该怎么做? 我使用此代码来应用我自己的CSS: 我的CSS的内容是: 如果我用这个CSS运行IPython脚本,那么我的笔记本网页将向左对齐,单元格的宽度为2000px,但是网页变成了大约1000px大小的水平滚动。所以我的细胞只有前半部分是可见的。 如果我设置在或在然后水平滚动消失,所以笔记本网页宽度将是2500px宽,我看到

  • 问题内容: 我正在尝试制作看起来不像tkinter应用程序的tkinter应用程序。我使用的是ttk笔记本,并且在选中选项卡时,这些选项在文本的周围都有一点点虚线。它看起来很糟糕,我找不到使用样式或配置删除它的方法。这是要说明的屏幕截图: 编辑代码(我认为这不会有很大帮助,因为我实际上只是在尝试删除默认样式的东西。): 这是笔记本的创建: 填写: 相关样式: 问题答案: 您可以通过更改选项卡小部件

  • 问题内容: 我正在开发一个用于监视笔记本电脑电源的应用程序。如果断电或恢复供电,它将通过电子邮件通知我。它还将对电子邮件进行应用程序监视和控制(基本上是通过电子邮件从我的办公室控制我的笔记本电脑)。我已经完成了电子邮件接口,但是我不知道如何从Java监视电源/电池供电。 如果有什么可以指点的,那将有很大的帮助。 提前致谢 .... 问题答案: 您可能已经解决了这个问题,但对于其他问题,您可以按照A

  • 我努力想喜欢IPython笔记本,但可能是因为我太习惯于用vi编写代码并在命令行执行,所以我发现它的一些默认设置很有挑战性。可以对以下内容做些什么(可能在某个配置文件中)? 我希望默认输出行号,而不必记住,也不必每次都设置别名。 我如何设置默认为"off",以阻止IPython污染我的命名空间与它的非百分比魔法和shell命令?我知道我可以使用选项和选项:是否有等效的选项? 让我抓狂的是,我从来都

  • 我使用的是戴尔Inspiron 5548(3年前),它有英特尔i5(2.2GHz,4核),8GB DDR2 ram和1TB HDD。但是当我启动hybris服务器时,一切都运行缓慢。 还是买台新笔记本电脑?建议哪个会好。

  • 我有一台4GB RAM和酷睿i5处理器的惠普笔记本电脑。在android studio下载页面中,已经指定建议使用4GB内存。但我的Android Studio仍然挂着,需要很多时间来回应。