线程池中空闲的线程处于什么状态

线程池中空闲的线程处于什么状态,第1张

一:阻塞状态,线程并没有销毁,也没有得到CPU时间片执行;

源码追踪:

for (;;) {

workQueuetake();

}

public E take(){

while (countget() == 0) { / /这里就是任务队列中的消息数量

notEmptyawait();

}

}

public final void await(){

LockSupportpark(this);

}

继续往下:

public static void park(Object blocker) {

Thread t = ThreadcurrentThread();

setBlocker(t, blocker);

Upark(false, 0L);

setBlocker(t, null);

}

private static final sunmiscUnsafe U = sunmiscUnsafegetUnsafe();

//线程调用该方法,线程将一直阻塞直到超时,或者是中断条件出现。

public native void park(boolean isAbsolute, long time);

上面就是java11线程池中阻塞的源码追踪;

二对比object的wait()方法:

@FastNative

public final native void wait(long timeout, int nanos) throws InterruptedException;

还有Thread的sleep() 方法:

@FastNative

private static native void sleep(Object lock, long millis, int nanos)throws;

可见,线程池中使用的阻塞方式并不是Object中的wait(),也不是Threadsleep() ;

这3个方法最终实现都是通过c&c++实现的native方法

三在<<Java虚拟机(第二版)>>中,对线程状态有以下介绍:

1243 状态转换

Java语言定义了5种线程状态,在任意一个时间点,一个线程只能有且只有其中的一种

状态,这5种状态分别如下。

1)新建(New):创建后尚未启动的线程处于这种状态。

2)运行(Runable):Runable包括了 *** 作系统线程状态中的Running和Ready,也就是处于此

状态的线程有可能正在执行,也有可能正在等待着CPU为它分配执行时间。

3)无限期等待(Waiting):处于这种状态的线程不会被分配CPU执行时间,它们要等待被

其他线程显式地唤醒。以下方法会让线程陷入无限期的等待状态:

●没有设置Timeout参数的Objectwait()方法。

●没有设置Timeout参数的Threadjoin()方法。

●LockSupportpark()方法。

4)限期等待(Timed Waiting):处于这种状态的线程也不会被分配CPU执行时间,不过无

须等待被其他线程显式地唤醒,在一定时间之后它们会由系统自动唤醒。以下方法会让线程

进入限期等待状态:

●Threadsleep()方法。

●设置了Timeout参数的Objectwait()方法。

●设置了Timeout参数的Threadjoin()方法。

●LockSupportparkNanos()方法。

●LockSupportparkUntil()方法。

5)阻塞(Blocked):线程被阻塞了,“阻塞状态”与“等待状态”的区别是:“阻塞状态”在等

待着获取到一个排他锁,这个事件将在另外一个线程放弃这个锁的时候发生;而“等待状

态”则是在等待一段时间,或者唤醒动作的发生。在程序等待进入同步区域的时候,线程将

进入这种状态。

结束(Terminated):已终止线程的线程状态,线程已经结束执行。

thread dump解析

头部信息

时间,jvm信息

{code}

2011-11-02 19:05:06

Full thread dump Java HotSpot(TM) Server VM (163-b01 mixed mode):

{code}

线程info信息块

{code}

"Checkpointer" daemon prio=10 tid=0x68ce1c00 nid=0x7c11 in Objectwait() [0x68b5c000]

javalangThreadState: WAITING (on object monitor)

at javalangObjectwait(Native Method)

- waiting on <0x740ad988> (a javalangObject)

at javalangObjectwait(Objectjava:485)

at comsleepycatjeutilintDaemonThreadrun(DaemonThreadjava:163)

- locked <0x740ad988> (a javalangObject)

at javalangThreadrun(Threadjava:619)

{code}

"Checkpointer" daemon prio=10 tid=0x68ce1c00 nid=0x7c11 in Objectwait() [0x68b5c000]

线程名称:Checkpointer

线程类型:daemon

优先级:10,默认是5

jvm线程id:jvm内部线程的唯一标识,0x68ce1c00

对应系统线程id:和top命令查看的pid对应,不过一个是10进制,一个是16进制。0x7c11

线程状态:Objectwait()

起始栈地址

线程状态详解

Runnable

_The thread is either running or ready to run when it gets its CPU turn_

不解释。

Wait on condition

_The thread is either sleeping or waiting to be notified by another thread_

该状态出现在线程等待某个条件的发生或者sleep。

_最常见的情况是线程在等待网络的读写,比如当网络数据没有准备好读时,线程处于这种等待状态,而一旦有数据准备好读之后,线程会重新激活,读取并处理数据。_

Waiting for Monitor Entry and in Objectwait()

_The thread is waiting to get the lock for an object (some other thread may be holding the lock) This happens if two or more threads try to execute synchronized code Note that the lock is always for an object and not for individual methods_

当一个线程申请进入临界区时,获取到monitor,线程将处于 “Runnable”的状态,否则,线程 DUMP会显示处于 “waiting for monitor entry”。

当线程获得了 Monitor,进入了临界区之后,如果发现线程继续运行的条件没有满足,它则调用对象(一般就是被 synchronized 的对象)的 wait() 方法,放弃了 Monitor,进入 “Wait Set”队列。只有当别的线程在该对象上调用了 notify() 或者 notifyAll() , “ Wait Set”队列中线程才得到机会去竞争,但是只有一个线程获得对象的 Monitor,恢复到运行态。在 “Wait Set”中的线程, DUMP中表现为: in Objectwait()。

例:

<span style="background-color: rgb(255, 255, 255);"><span style="color:#ff6666;">{code}

"Timer-0" daemon prio=10 tid=0x695c3000 nid=0x7c00 in Objectwait() [0x69468000]

javalangThreadState: TIMED_WAITING (on object monitor)

at javalangObjectwait(Native Method)

- waiting on <0x744f2850> (a javautilTaskQueue) ###继续wait

at javautilTimerThreadmainLoop(Timerjava:509)

- locked <0x744f2850> (a javautilTaskQueue) ###已经lock到0x744f2850

at javautilTimerThreadrun(Timerjava:462)

{code}</span></span>

参见:>

rt_thread_t和rt_thread都是RT-Thread Kernel中的数据类型,它们之间的区别如下:

1 rt_thread_t是线程句柄类型,用于表示一个线程的句柄,线程句柄可以被线程调度器用来选取和调度线程,因此它是线程的唯一标识符。而rt_thread是线程的结构体,用于表示一个线程的具体信息,包括线程的优先级、栈大小、运行时间片等信息。

2 rt_thread_t是一个32位的无符号整数类型,用于表示线程的句柄,它的取值范围为0~。而rt_thread是一个自定义的结构体类型,定义在rt_threadh文件中,用于表示一个线程的具体信息。

3 在RT-Thread Kernel中,线程的 *** 作通常是通过线程句柄来完成的,例如创建线程、等待线程结束、获取线程信息等 *** 作,都需要使用线程句柄。而线程的详细信息,例如优先级、栈大小、运行时间片等,则需要通过线程结构体rt_thread来获取。

以上就是关于线程池中空闲的线程处于什么状态全部的内容,包括:线程池中空闲的线程处于什么状态、如何分析java thread dump、rt_thread_t和rt_thread区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9311119.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存