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

Java多线程-空闲线程的状态

谭向晨
2023-03-14

>

  • 我是Java多线程的新手。想知道线程池执行器中空闲线程的状态。它在RUNNABLE/WAITING中吗?

    如果空闲线程处于RUNNABLE状态,新任务如何附加到空闲线程?AFAIK我们为线程/池分配一个可运行/可调用的对象。但我的问题是ThreadPoolExecitor如何将排队的可运行对象分配给空闲线程??

  • 共有2个答案

    欧阳骏俊
    2023-03-14
    1. 很想知道ThreadPoolExecutor中空闲线程的状态。它是否处于可运行/等待状态

    它将等待。它正在等待(在队列中。take()调用)新任务出现在工作队列中。在当前的实现中,这涉及一种类似于等待/通知的机制。

    因此,你的第二个问题没有实际意义。

    然而,值得注意的是:

    >

  • 任何“空闲”线程都无法运行。

    在当前一代的热点JVM中,实际的调度(决定哪些线程获得优先级并为它们分配一个内核来运行)由操作系统处理。

    在Loom JVM(Loom仍然是一个孵化器项目)中,轻量级虚拟线程(“光纤”)由JVM而不是OS调度(到本机线程)。

  • 凌鹏程
    2023-03-14

    很容易找到:

    import java.util.concurrent.Executor;
    import java.util.concurrent.Executors;
    import java.io.IOException;
    
    public class ThreadExample {
    
        public static void main(String[] args) throws IOException {
            Executor executor = Executors.newFixedThreadPool(5);
            // force the threads to be started
            for (int i = 0; i < 5; i++) {
                executor.execute(() -> {
                    try {Thread.sleep(1000);} catch (InterruptedException e) {
                    }
                });
            }
            // don't terminate
            System.in.read();
        }
    }
    

    运行它:

    $ javac ThreadExample.java
    $ java ThreadExample
    

    在另一个控制台中,等待任务完成至少一秒钟后:

    $ ps
      PID TTY           TIME CMD
     3640 ttys000    0:00.25 -bash
     5792 ttys000    0:00.15 java ThreadExample
     5842 ttys001    0:00.05 -bash
    $ jstack 5792
    ...
    "pool-1-thread-1" #12 prio=5 os_prio=31 cpu=1.77ms elapsed=13.37s tid=0x00007fe99f833800 nid=0xa203 waiting on condition  [0x00007000094b2000]
       java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
        - parking to wait for  <0x000000061ff9e998> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.2/LockSupport.java:194)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.2/AbstractQueuedSynchronizer.java:2081)
        at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.2/LinkedBlockingQueue.java:433)
        at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.2/ThreadPoolExecutor.java:1054)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.2/ThreadPoolExecutor.java:1114)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.2/ThreadPoolExecutor.java:628)
        at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
    ...
    

    所有池线程都处于该状态。

     类似资料:
    • 我正在使用固定大小的Java线程池(ExecutorService)。假设我向线程池提交了一个作业,并且该作业处于空闲状态。 是否有可能从线程池中删除空闲作业,以便可以处理队列中的其他作业,然后再添加空闲作业?

    • 打印空闲线程钩子函数的运行次数 打印空闲线程钩子函数的运行次数 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-08-24 yangjie the first v

    • 本文向大家介绍IOS多线程开发之线程的状态,包括了IOS多线程开发之线程的状态的使用技巧和注意事项,需要的朋友参考一下 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算。可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行。但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行。改变这种状况可以从两个角度出发:对于单核处理器,可以将多个

    • 我找到了关于线程安全的代码,但它没有来自给出示例的人的任何解释。我想知道为什么如果我不在“count”之前设置“synchronized”变量,那么count值将是非原子的(总是=200是期望的结果)。谢谢

    • 本文向大家介绍总结Java中线程的状态及多线程的实现方式,包括了总结Java中线程的状态及多线程的实现方式的使用技巧和注意事项,需要的朋友参考一下 线程的状态 线程状态图: 说明: 线程共包括以下5种状态。 1. 新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。 2. 就绪状态(Runnable): 也被称为“可执行状态”

    • 本文向大家介绍java 线程创建多线程详解,包括了java 线程创建多线程详解的使用技巧和注意事项,需要的朋友参考一下 Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类。 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: Tread thread = new Thread(); thread.sta