made all fields final. Could not resist, sorry
[fedora-idea.git] / source / com / intellij / unscramble / ThreadState.java
blobdb8622a3a5a02f83c0e755fbb2b29945ba68e2c0
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;
8 import java.util.List;
9 import java.util.Set;
11 /**
12 * @author yole
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>();
25 @Nullable
26 private ThreadOperation myOperation;
28 public ThreadState(final String name, final String state) {
29 myName = name;
30 myState = state.trim();
33 public String getName() {
34 return myName;
37 public String getState() {
38 return myState;
41 public String getStackTrace() {
42 return myStackTrace;
45 public void setStackTrace(final String stackTrace, boolean isEmpty) {
46 myStackTrace = stackTrace;
47 myEmptyStackTrace = isEmpty;
50 public String toString() {
51 return myName;
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() {
78 return myExtraState;
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);
111 @Nullable
112 public ThreadOperation getOperation() {
113 return myOperation;
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");