kid*_*her 4 java performance android thread-dump thread-state
我正在Android Studio中学习该工具,获取线程转储,如下所示:
我注意到每个线程的状态都不同,
我可以看到有runnable
,sleeping
,waiting
。我深入线程堆栈,大多数这样的线程堆栈,
"<61> RxComputationScheduler-3@830064517520" daemon prio=5 waiting
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Object.java:-1)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2017)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1050)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:778)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1035)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1097)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Run Code Online (Sandbox Code Playgroud)
我很困惑,他们这样做都停止Object.wait
,但线程的状态可以是runnable
,sleeping
,waiting
?
这是另一个状态线程的堆栈。
RUNNABLE
<53> RxSchedulerPurge-1@830057651944" daemon prio=5 runnable
java.lang.Thread.State: RUNNABLE
at java.lang.Object.wait(Object.java:-1)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:197)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2056)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1062)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:778)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1035)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1097)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)</code>
Run Code Online (Sandbox Code Playgroud)
TIMED_WAITING
<58> RxScheduledExecutorPool-2@830064740632" daemon prio=5 sleeping
java.lang.Thread.State: TIMED_WAITING
at java.lang.Object.wait(Object.java:-1)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:197)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2056)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1062)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:778)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1035)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1097)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Run Code Online (Sandbox Code Playgroud)
新建表示如果您创建Thread
类的实例但在start()
方法调用之前,线程处于新状态:
Thread t = new Thread(...); // t is New
Run Code Online (Sandbox Code Playgroud)
Runnable表示start()
方法调用后线程处于可运行状态。基本上:
t.start(); // t is Runnable
Run Code Online (Sandbox Code Playgroud)
运行是Runnable的“子状态” :如果线程调度程序选择了线程,则该线程处于运行状态。您无法对其进行任何明确的操作,这意味着您先打电话start()
然后等待。
Ready是Runnable的另一个“子状态” :该线程可以运行,并等待线程调度程序选择它。
阻塞表示线程仍处于活动状态,但当前不符合运行条件。例如,当一个线程遇到一个synchronized
块,而另一个线程处理该块时,就会发生这种情况。在这种情况下,第一个线程被阻塞。
等待是线程既未阻塞也未就绪的状态。通常在调用wait()
或join()
在线程上时发生。
Thread t1 = new Thread(); // t1 is New
Thread t2 = new Thread(); // t2 is New
t1.start(); // t1 becomes Runnable
t2.start(); // t2 becomes Runnable
t1.join(); // t2 becomes Waiting, because t1 is processed until it terminates
Run Code Online (Sandbox Code Playgroud)
还有一个称为“ 定时等待”的状态,它几乎是同一件事,但是是由引起的sleep()
。如果调用wait(timeout)
或join(timeout)
,则线程还将获得定时等待状态。
Thread t = new Thread(); // t is New
t.start(); // t is Runnable
t.sleep(4000); // t get state of Timed Waiting for 4 seconds
Run Code Online (Sandbox Code Playgroud)
当run()
方法退出时,终止是处于终止或死状态的线程。
我想我涵盖了所有内容:)这是一张图片,可帮助您更清楚地理解它:
根据JoxTraex的要求,以下是我在发布之前阅读的资源:
这只是一个很好的谷歌搜索技巧,真的...