void (final ThreadState threadState) { @NonNls String stackTrace = threadState.getStackTrace(); if (stackTrace.contains("at java.net.PlainSocketImpl.socketAccept") || stackTrace.contains("at java.net.PlainDatagramSocketImpl.receive") || stackTrace.contains("at java.net.SocketInputStream.socketRead") || stackTrace.contains("at java.net.PlainSocketImpl.socketConnect")) { threadState.setOperation(ThreadOperation.Socket); } else if (stackTrace.contains("at java.io.FileInputStream.readBytes")) { threadState.setOperation(ThreadOperation.IO); } else if (stackTrace.contains("at java.lang.Thread.sleep")) { final String javaThreadState = threadState.getJavaThreadState(); if (!Thread.State.RUNNABLE.name().equals(javaThreadState)) { threadState.setThreadStateDetail("sleeping"); // JDK 1.6 sets this explicitly, but JDK 1.5 does not } } if (threadState.isEDT()) { if (stackTrace.contains("java.awt.EventQueue.getNextEvent")) { threadState.setThreadStateDetail("idle"); } int modality = 0; int pos = 0; while(true) { pos = stackTrace.indexOf(PUMP_EVENT, pos); if (pos < 0) break; modality++; pos += PUMP_EVENT.length(); } threadState.setExtraState("modality level " + modality); } }