Article View: pl.comp.lang.java
Article #141998Re: w jaki sposob moge sprawdzic gdzie sie zatrzymaly watki?
From: Filip Sielimowicz
Date: Wed, 29 Oct 2008 09:49
Date: Wed, 29 Oct 2008 09:49
121 lines
3297 bytes
3297 bytes
Użytkownik "R.M." <rafalm1980@gmail.com> napisał w wiadomości
news:ge96bl$md3$1@news.vectranet.pl...
> Witam,
> Mam program wielowatkowy, w pewnym momencie gdzies (chyba) pojawia sie
> deadlock, nie mam pojecia gdzie, w jaki sposob moglbym zlokalizowac
> usterke, chodzi o przerwanie dzialania programu i sprawdzenie jakie
> funkcje sa w danej chwili wykonywane (np. lock.lock(), stream.read())
>
> uzywam netbeans 6.1
>
> pozdrawiam,
> R.M.
;))
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
/**
* Klasa narzędziowa, zawiera procedurę zrzucania
* na stdout stack trace'a wszystkich wątków,
* + prosta statystyką pokazująca np. w których miejscach
* najwięcej wątków "wisi".
* @author filip
*/
public class ThreadsSnapshot {
public ThreadsSnapshot() {
logThreads();
}
final int TRACES = 30;
public void logThreads() {
Map<Thread, StackTraceElement[]> traces= Thread.getAllStackTraces();
Map<String, Integer> idTracesCounts = new HashMap<String, Integer>();
for (Entry<Thread, StackTraceElement[]> ent : traces.entrySet()) {
System.out.println("Thread ["+ent.getKey().getName()+"]");
StackTraceElement[] tr = ent.getValue();
StackTraceElement idTrace = null;
for (int i=0;i<TRACES && i<tr.length;i++) {
int t = i;
System.out.println("\t "+tr[t].getClassName()+"."+tr[t].getMethodName()+"()
("+tr[t].getFileName()+":"+tr[t].getLineNumber()+")");
if (idTrace==null) {
String meth = tr[t].getClassName()+"."+tr[t].getMethodName()+"()";
if (!"java.lang.Object.wait()".equals(meth)) {
idTrace = tr[t];
Integer cntr = idTracesCounts.remove(meth);
if (cntr==null) cntr=0;
cntr = cntr+1;
idTracesCounts.put(meth, cntr);
}
}
}
System.out.println("");
}
System.out.println("Statystyka punktów zatrzymania:");
System.out.println(""+traces.size()+"\t - Ogólna liczba wątków");
for (Entry<String, Integer> ent : idTracesCounts.entrySet()) {
System.out.println(""+ent.getValue()+"\t - "+ent.getKey());
}
System.out.println(" *** KONIEC");
}
/** Przykładowe odpalenie - prezentacja jak to używać */
public static void main(String[] args) {
new ThreadsSnapshot();
}
}
Technical Details
Message-ID:
<ge9c1p$qme$1@nemesis.news.neostrada.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.internetia.pl!news.intelink.pl!newsfeed.neostrada.pl!atlantis.news.neostrada.pl!news.neostrada.pl!not-for-mailReferences:
<ge96bl$md3$1@news.vectranet.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.internetia.pl!news.intelink.pl!newsfeed.neostrada.pl!atlantis.news.neostrada.pl!news.neostrada.pl!not-for-mail From: "Filip Sielimowicz" <sielim@wp.pl> Newsgroups: pl.comp.lang.java Subject: Re: w jaki sposob moge sprawdzic gdzie sie zatrzymaly watki? Date: Wed, 29 Oct 2008 10:49:09 +0100 Organization: TP - http://www.tp.pl/ Lines: 123 Message-ID: <ge9c1p$qme$1@nemesis.news.neostrada.pl> References: <ge96bl$md3$1@news.vectranet.pl> NNTP-Posting-Host: efp194.internetdsl.tpnet.pl Mime-Version: 1.0 X-Trace: nemesis.news.neostrada.pl 1225274233 27342 83.14.249.194 (29 Oct 2008 09:57:13 GMT) X-Complaints-To: usenet@news.neostrada.pl NNTP-Posting-Date: Wed, 29 Oct 2008 09:57:13 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.3138 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3350 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit