1 package com
.intellij
.unscramble
;
3 import org
.jetbrains
.annotations
.NonNls
;
4 import org
.jetbrains
.annotations
.Nullable
;
6 import java
.util
.ArrayList
;
7 import java
.util
.HashSet
;
14 public class ThreadState
{
15 private final String myName
;
16 private final String myState
;
17 private String myStackTrace
;
18 private boolean myEmptyStackTrace
;
19 private String myJavaThreadState
;
20 private String myThreadStateDetail
;
21 private String myExtraState
;
22 private final List
<ThreadState
> myThreadsWaitingForMyLock
= new ArrayList
<ThreadState
>();
23 private final Set
<ThreadState
> myDeadlockedThreads
= new HashSet
<ThreadState
>();
26 private ThreadOperation myOperation
;
28 public ThreadState(final String name
, final String state
) {
30 myState
= state
.trim();
33 public String
getName() {
37 public String
getState() {
41 public String
getStackTrace() {
45 public void setStackTrace(final String stackTrace
, boolean isEmpty
) {
46 myStackTrace
= stackTrace
;
47 myEmptyStackTrace
= isEmpty
;
50 public String
toString() {
54 public void setJavaThreadState(final String javaThreadState
) {
55 myJavaThreadState
= javaThreadState
;
58 public void setThreadStateDetail(@NonNls final String threadStateDetail
) {
59 myThreadStateDetail
= threadStateDetail
;
62 public String
getJavaThreadState() {
63 return myJavaThreadState
;
66 public String
getThreadStateDetail() {
67 if (myOperation
!= null) {
68 return myOperation
.toString();
70 return myThreadStateDetail
;
73 public boolean isEmptyStackTrace() {
74 return myEmptyStackTrace
;
77 public String
getExtraState() {
81 public void setExtraState(final String extraState
) {
82 myExtraState
= extraState
;
85 public boolean isSleeping() {
86 return "sleeping".equals(getThreadStateDetail()) ||
87 (("parking".equals(getThreadStateDetail()) || "waiting on condition".equals(myState
)) && isThreadPoolExecutor());
90 private boolean isThreadPoolExecutor() {
91 return myStackTrace
.contains("java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take") ||
92 myStackTrace
.contains("java.util.concurrent.ThreadPoolExecutor.getTask");
95 public boolean isHoldingLock(ThreadState thread
) {
96 return myThreadsWaitingForMyLock
.contains(thread
);
99 public void addWaitingThread(ThreadState thread
) {
100 myThreadsWaitingForMyLock
.add(thread
);
103 public boolean isDeadlocked() {
104 return !myDeadlockedThreads
.isEmpty();
107 public void addDeadlockedThread(ThreadState thread
) {
108 myDeadlockedThreads
.add(thread
);
112 public ThreadOperation
getOperation() {
116 public void setOperation(@Nullable final ThreadOperation operation
) {
117 myOperation
= operation
;
120 public boolean isLocked() {
121 return "on object monitor".equals(myThreadStateDetail
) || "waiting on condition".equals(myState
) ||
122 ("parking".equals(myThreadStateDetail
) && !isSleeping());
125 public boolean isEDT() {
126 return getName().startsWith("AWT-EventQueue");