java - 我有一台双核机器。在java中,我的计算机如何管理3个线程的fixedThreadPool? jvm 的可能行为是什么?

标签 java multithreading

如果我的机器是双核处理器,我正在尝试想象我的机器如何处理这段代码。如果它是四核机器,它会如何表现?

    ExecutorService executor = Executors.newFixedThreadPool(3);

    // Submission of tasks
    for (int i =0; i<10; i++){
        executor.submit(new Processor(i));
    }

Processor 有一个 run 方法打印“running in thread: about to sleep...” 然后它 hibernate 5 秒,然后打印“在线程中运行:醒来......”

我正在尝试将 Java 代码和硬件之间的点联系起来。我很难想象这在不同的处理器环境中有何不同。有人可以举例说明在这种情况下 jvm 的可能行为吗?提前谢谢你。

最佳答案

您对每个问题的回答都是"is"。或者,不那么害羞,您要求我们记录的行为是未定义,非常故意只是松散地定义。

JVM 和 O/S 一起工作,可以随时以任何顺序在任何可用的 CPU/内核上运行线程,只要它们有资格运行,前提是它们在 runningwoke up 消息。由于 sleep 的性质,至少会在那个时间,并且线程会在调度程序可以管理的最接近那个时间醒来。

除此之外,没有更多可以说的了。


作为对评论的回应,问题的代码会将 10 个项目添加到任务队列中,并且一次最多出列三个项目 (*) 并同时运行每组三个项目。

因为执行时间主要由 sleep 决定,所以无论有多少核可用,行为本质上都是相同的。

但是,事情发生的确切顺序是不确定的,除了任务将按照添加的顺序被取消这一事实之外。因此,虽然您可以确定第 10 个任务将在第一个任务之后执行,但您不能确定 1、2 和 3 的顺序,也不能确定 4、5 或 6 是否会在 1、2 或 3 完全完成之前开始.

(*) 最多三个,因为最后一组只有两个项目,第三个线程在运行时将处于空闲状态。

关于java - 我有一台双核机器。在java中,我的计算机如何管理3个线程的fixedThreadPool? jvm 的可能行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23794386/

相关文章:

java - 使用 SWIG 将 Java Map<String, String> 传递给 C++ 方法

java - 在处理不可变对象(immutable对象)时,如何最好地返回带有修改字段的副本?

java - 对多个线程同时访问的静态 final方法的混淆

multithreading - 线程 perl 和信号处理程序

java - 基于 MVC 在 jsp/servlet 应用程序中设置连接池?

Java String.replaceAll 带有命名组的反向引用

c++ - 适合 BitTorrent 客户端的多线程模型?

java - 分层死锁(具有依赖性),...或 : how do I get my "wait"s, "notify"s,设计对吗?

Java如何: proper GUI coding?

C++11 线程 boost 容器