2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com
.intellij
.unscramble
;
18 import org
.jetbrains
.annotations
.NonNls
;
19 import org
.jetbrains
.annotations
.Nullable
;
21 import java
.util
.Collection
;
22 import java
.util
.Collections
;
23 import java
.util
.HashSet
;
29 public class ThreadState
{
30 private final String myName
;
31 private final String myState
;
32 private String myStackTrace
;
33 private boolean myEmptyStackTrace
;
34 private String myJavaThreadState
;
35 private String myThreadStateDetail
;
36 private String myExtraState
;
37 private final Set
<ThreadState
> myThreadsWaitingForMyLock
= new HashSet
<ThreadState
>();
38 private final Set
<ThreadState
> myDeadlockedThreads
= new HashSet
<ThreadState
>();
41 private ThreadOperation myOperation
;
43 public ThreadState(final String name
, final String state
) {
45 myState
= state
.trim();
48 public String
getName() {
52 public String
getState() {
56 public String
getStackTrace() {
60 public void setStackTrace(final String stackTrace
, boolean isEmpty
) {
61 myStackTrace
= stackTrace
;
62 myEmptyStackTrace
= isEmpty
;
65 public Collection
<ThreadState
> getAwaitingThreads() {
66 return Collections
.unmodifiableSet(myThreadsWaitingForMyLock
);
69 public String
toString() {
73 public void setJavaThreadState(final String javaThreadState
) {
74 myJavaThreadState
= javaThreadState
;
77 public void setThreadStateDetail(@NonNls final String threadStateDetail
) {
78 myThreadStateDetail
= threadStateDetail
;
81 public String
getJavaThreadState() {
82 return myJavaThreadState
;
85 public String
getThreadStateDetail() {
86 if (myOperation
!= null) {
87 return myOperation
.toString();
89 return myThreadStateDetail
;
92 public boolean isEmptyStackTrace() {
93 return myEmptyStackTrace
;
96 public String
getExtraState() {
100 public void setExtraState(final String extraState
) {
101 myExtraState
= extraState
;
104 public boolean isSleeping() {
105 return "sleeping".equals(getThreadStateDetail()) ||
106 (("parking".equals(getThreadStateDetail()) || "waiting on condition".equals(myState
)) && isThreadPoolExecutor());
109 private boolean isThreadPoolExecutor() {
110 return myStackTrace
.contains("java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take") ||
111 myStackTrace
.contains("java.util.concurrent.ThreadPoolExecutor.getTask");
114 public boolean isAwaitedBy(ThreadState thread
) {
115 return myThreadsWaitingForMyLock
.contains(thread
);
118 public void addWaitingThread(ThreadState thread
) {
119 myThreadsWaitingForMyLock
.add(thread
);
122 public boolean isDeadlocked() {
123 return !myDeadlockedThreads
.isEmpty();
126 public void addDeadlockedThread(ThreadState thread
) {
127 myDeadlockedThreads
.add(thread
);
131 public ThreadOperation
getOperation() {
135 public void setOperation(@Nullable final ThreadOperation operation
) {
136 myOperation
= operation
;
139 public boolean isWaiting() {
140 return "on object monitor".equals(myThreadStateDetail
) ||
141 myState
.startsWith("waiting") ||
142 ("parking".equals(myThreadStateDetail
) && !isSleeping());
145 public boolean isEDT() {
146 final String name
= getName();
150 public static boolean isEDT(String name
) {
151 return name
.startsWith("AWT-EventQueue");