{"id":91,"date":"2007-07-31T17:46:00","date_gmt":"2007-07-31T17:46:00","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=91"},"modified":"2007-07-31T17:46:00","modified_gmt":"2007-07-31T17:46:00","slug":"danke-fur-die-nutzung-der-insel-als-vorlage-fur-uni-folien","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2007\/07\/danke-fur-die-nutzung-der-insel-als-vorlage-fur-uni-folien\/","title":{"rendered":"Danke f\u00fcr die Nutzung der Insel als Vorlage f\u00fcr Uni-Folien"},"content":{"rendered":"<p>Hier m\u00f6chte ich mich bei Ihnen, Herrn Dr. Ralf Kunze, und Team der Universit\u00e4t Osnabr\u00fcck herzlich bedanken. Es freut mich sehr, dass Sie f\u00fcr ihre Vorlesungsunterlagen <a href=\"http:\/\/www-lehre.inf.uos.de\/%7Ebinf\/2007\/index.html\">http:\/\/www-lehre.inf.uos.de\/~binf\/2007\/index.html<\/a> &#8222;Objekt-orientierte Programmierung in Java&#8220; im Sommersemester 2007 so viel Abschnitte der Insel gebrauchen konnten. Immer wieder begl\u00fcckt es mich, wenn Referenten und Dozenten Abschnitte 1:1 \u00fcbernehmen und damit die Qualit\u00e4t meines Buches \u201eJava ist auch eine Insel\u201c auch f\u00fcr den wissenschaftlichen Alltag best\u00e4tigen. (Ich wusste auch nicht, dass Rechtschreibfehler im Buch ebenfalls zum Insel-Kult geh\u00f6ren, und sie deshalb auch immer mitkopiert werden m\u00fcssen.) Dass Sie dabei die Insel erst an dritter Stelle Ihrer Literaturangaben platzieren, ist selbstverst\u00e4ndlich zu verzeihen. Besonders gefallen hat mir auf Ihrer Uni-Seite die Aussage \u201eZum legalen online Lesen, herunterladen oder auch kaufen\u201c. Das finde ich gut, denn \u201eillegales Online-Lesen\u201c w\u00e4re ja quatsch. Nat\u00fcrlich habe weder ich noch mein Verlag Galileo-Computing etwas dagegen einzuwenden, wenn ohne Nachfrage die gegl\u00fccktesten Abschnitte kopiert und ohne Kennung der Quellen \u00fcbernommen werden \u2013 Seite f\u00fcr Seite als Zitat zu kennzeichnen ist nat\u00fcrlich l\u00e4stig. Das ist Arbeiten im Sinne von Stanis&#322;aw Jerzy Lec: \u201eVon der Mehrzahl der Werke bleiben nur die Zitate \u00fcbrig. Ist es dann nicht besser, von Anfang an nur die Zitate aufzuschreiben?\u201c<\/p>\n<p>Ich war so frei, einige Ihrer Folien auf meinen Blog aufzunehmen. Ich hoffe, Sie sehen von Klagen wegen Urheberrechtsverletzungen ab; immerhin kopiere ich Ihre Texte hier ohne Nachfrage. (Alles Aufzulisten w\u00e4re zu viel Arbeit. <br \/>Das sind nur <i>einige<\/i> Beispiele mit <i>direkten<\/i> Kopien ganzer Abs\u00e4tze <br \/>f\u00fcr je eine Folie.)<\/p>\n<p><\/p>\n<table border=\"1\" width=\"100%\" id=\"table1\"> <\/p>\n<tr>  <\/p>\n<td width=\"50%\"><em>Insel<\/em><\/td>\n<p>  <\/p>\n<td width=\"50\"><em>Kopie<\/em><\/td>\n<p> <\/tr>\n<p> <\/p>\n<tr>  <\/p>\n<td>\n<ul>\n<li>throws bei \u00fcberschriebenen Methoden<\/li>\n<li>\u00dcberschriebene Methoden in einer Unterklasse d\u00fcrfen nicht mehr Ausnahmen ausl\u00f6sen wie schon beim throws-Teil der Oberklasse aufgef\u00fchrt sind.<\/li>\n<li>Da das gegen das das Substitutionsprinzip versto\u00dfen w\u00fcrde, kann eine Methode der Unterklasse<br \/>&#8211; nur dieselben Ausnahmen wie die <b>Oberkasse<\/b> ausl\u00f6sen<br \/>&#8211; Ausnahmen spezialisieren oder<br \/>&#8211; weglassen.<\/li>\n<\/ul>\n<\/td>\n<p>  <\/p>\n<td>\n<ul>\n<li>throws bei \u00fcberschriebenen Methoden<\/li>\n<li>\u00dcberschriebene Methoden in einer Unterklasse d\u00fcrfen nicht mehr Ausnahmen in der throws-Klausel deklarieren als schon bei der throws-<br \/>Klausel der Oberklasse aufgef\u00fchrt sind<\/li>\n<li>Das w\u00fcrde gegen das Substitutionsprinzip versto\u00dfen. Eine Methode der Unterklasse kann:<br \/>\u2013dieselben Ausnahmen wie die <b>Oberkasse<\/b> ausl\u00f6sen<br \/>\u2013Ausnahmen spezialisieren<br \/>\u2013weglassen<\/li>\n<\/ul>\n<\/td>\n<p> <\/tr>\n<p> <\/p>\n<tr>  <\/p>\n<td>\n<ul>\n<li>Abschlussbehandlung mit finally<\/li>\n<li>Nach einem (oder mehreren) catch kann optional ein finally-Block folgen.<\/li>\n<li>Die Laufzeitumgebung f\u00fchrt die Anweisungen im finally-Block immer aus, egal, ob ein Fehler auftrat, oder die Anweisungen im try-catch-Block optimal durchliefen.<\/li>\n<li>Das hei\u00dft, der Block wird auf jeden Fall ausgef\u00fchrt, auch wenn im try-catch-Block ein return, break oder continue steht oder eine Anweisung eine neue Ausnahme ausl\u00f6st.<\/li>\n<li>Der Programmcode im finally-Block bekommt auch gar nicht mit, ob vorher eine Ausnahme auftrat oder alles glatt lief.<\/li>\n<li>Sinnvoll sind Anweisungen im finally-Block immer dann, wenn Operationen immer ausgef\u00fchrt werden sollen.<\/li>\n<li>Eine typische Anwendung ist die Freigabe von Ressourcen oder das Schlie\u00dfen von Dateien.<\/li>\n<\/ul>\n<p>  <\/td>\n<p>  <\/p>\n<td>\n<ul>\n<li>Abschlussbehandlung mit finally<\/li>\n<li>Nach einem (oder mehreren) catchkann optional ein finally-Blockfolgen<\/li>\n<li>Die Laufzeitumgebung f\u00fchrt die Anweisungen im finally-Blockimmer aus, egal, ob ein Fehler auftrat, oder die Anweisungen im try\/catch-Block optimal durchliefen.<\/li>\n<li>Das hei\u00dft, der Block wird auf jeden Fall ausgef\u00fchrt, auch wenn im try\/catch-Blockein return, break oder continuesteht oder eine Anweisung eine neue Ausnahme ausl\u00f6st<\/li>\n<li>Der Programmcode im finally-Blockbekommt nicht mit, ob vorher eine Ausnahme auftrat<\/li>\n<li>Sinnvoll sind Anweisungen im finally-Blockimmer dann, wenn Operationen immer ausgef\u00fchrt werden sollen<\/li>\n<li>Eine typische Anwendung ist die Freigabe von Ressourcen oder das Schlie\u00dfen von Dateien<\/li>\n<\/ul>\n<p>  <\/td>\n<p> <\/tr>\n<p> <\/p>\n<tr>  <\/p>\n<td>\n<ul>\n<li>Bei der Konvertierung eines gr\u00f6\u00dferen Ganzzahltyps in einen kleineren werden einfach die oberen Bits abgeschnitten.<\/li>\n<li>Eine Anpassung des Vorzeichens findet nicht statt.<\/li>\n<li>Die Darstellung in Bit zeigt das sehr anschaulich:\n<p>   int ii = 123456789; \/\/ 0000011101011011<b>1<\/b>100110100010101<\/p>\n<p>   int ij = \u2013123456; \/\/ 1111111111111110<b>0<\/b>001110111000000 short <br \/>   si = (short) ii; \/\/                 <b>1<\/b>100110100010101<\/p>\n<p>   short sj = (short) ij; \/\/                 <b>0<\/b>001110111000000 <br \/>   System.out.println( si ); \/\/ \u201313035<\/p>\n<p>   System.out.println( sj ); \/\/ 7616<\/li>\n<\/ul>\n<\/td>\n<p>  <\/p>\n<td>\n<ul>\n<li>Bei der Konvertierung eines gr\u00f6\u00dferen Ganzzahltyps in einen kleineren werden einfach die oberen Bits abgeschnitten<\/li>\n<li>Eine Anpassung des Vorzeichens findet nicht statt<\/li>\n<li>Die Darstellung in Bit zeigt das sehr anschaulich:\n<p>   int m = 123456789; \/\/ 00000111010110111100110100010101<\/p>\n<p>   shorts m = (short) m;\/\/ 1100110100010101<br \/>System.out.println(sm); \/\/ -13035<\/p>\n<p>   int n = -123456;\/\/ 11111111111111100001110111000000<\/p>\n<p>   short sn= (short) n;\/\/ 0001110111000000<\/p>\n<p>   System.out.println(sn); \/\/ 7616<\/li>\n<\/ul>\n<\/td>\n<p> <\/tr>\n<p> <\/p>\n<tr>  <\/p>\n<td>\n<ul>\n<li>Eine Datei oder ein Verzeichnis besitzt zahlreiche Eigenschaften, die sich mit Anfragemethoden auslesen lassen. In einigen wenigen F\u00e4llen lassen sich die Attribute auch \u00e4ndern.<\/li>\n<li>boolean canExecute(), canRead(), canWrite(). true, wenn die Ausf\u00fchrungsrechte\/Leserechte\/Schreibrechte gesetzt sind.<\/li>\n<li>long length() Gibt die L\u00e4nge der Datei in Byte zur\u00fcck oder 0L, wenn die Datei nicht existiert oder es sich um ein Verzeichnis handelt.<\/li>\n<li>long lastModified() Liefert den Zeitpunkt, zu dem die Datei zum letzten Mal ge\u00e4ndert wurde. Die Zeit wird in Millisekunden ab dem 1. Januar 1970, 00:00:00 UTC, gemessen. Die Methode liefert 0, wenn die Datei nicht existiert oder ein Ein-\/Ausgabefehler auftritt.<\/li>\n<li>boolean setLastModified( long time ) Setzt die Zeit (wann die Datei zuletzt ge\u00e4ndert wurde). Die Zeit ist wiederum in Millisekunden seit dem 1. Januar 1970 angegeben. Ist das Argument negativ, dann wird eine IllegalArgumentException ausgel\u00f6st.<\/li>\n<\/ul>\n<p>  <\/td>\n<p>  <\/p>\n<td>\n<ul>\n<li>Eine Datei oder ein Verzeichnis besitzt zahlreiche Eigenschaften, die sich mit Anfragemethoden auslesen und teilweise auch \u00e4ndern lassen:<\/li>\n<li>boolean canExecute() (Java6), canRead(), canWrite()liefern true, wenn die Ausf\u00fchrungsrechte\/Leserechte\/Schreibrechte gesetzt sind<\/li>\n<li>long length() Gibt die L\u00e4nge der Datei in Byte zur\u00fcck oder 0L, wenn die Datei nicht existiert oder es sich um ein Verzeichnis handelt<\/li>\n<li>long lastModified() Liefert den Zeitpunkt, zu dem die Datei zum letzten Mal ge\u00e4ndert wurde. Die Zeit wird in Millisekunden ab dem 1. Januar 1970, 00:00:00 UTC, gemessen. Die Methode liefert 0, wenn die Datei nicht existiert oder ein Ein-\/Ausgabefehler auftritt<\/li>\n<li>boolean setLastModified(longtime)Setzt die Zeit (wann die Datei zuletzt ge\u00e4ndert wurde). Die Zeit ist wiederum in Millisekunden seit dem 1. Januar 1970 angegeben. Ist das Argument negativ, dann wird eine IllegalArgumentException ausgel\u00f6st<\/li>\n<\/ul>\n<p>  <\/td>\n<p> <\/tr>\n<p> <\/p>\n<tr>  <\/p>\n<td>\n<ul>\n<li>Die Schnittstellen Closeable und Flushable<\/li>\n<li>Closeable wird von allen lesenden und schreibenden Datenstrom-Klassen implementiert, die geschlossen werden k\u00f6nnen.<\/li>\n<li>Das sind alle Reader\/Writer- und InputStream\/OutputStream-Klassen.<\/li>\n<li>void close() throws IOException. Schlie\u00dft den Datenstrom. Einen geschlossenen Strom noch einmal zu schlie\u00dfen hat keine Konsequenz.<\/li>\n<li>Flushable findet sich nur bei schreibenden Klassen und ist insbesondere bei denen wichtig, die Daten puffern.<\/li>\n<li>void flush() throws IOException Schreibt gepufferte Daten in den Strom.<\/li>\n<\/ul>\n<p>  <\/td>\n<p>  <\/p>\n<td>\n<ul>\n<li>Closeableund Flushable<\/li>\n<li>Closeable wird von allen lesenden und schreibenden Datenstrom-Klassen implementiert, die geschlossen werden k\u00f6nnen<\/li>\n<li>Das sind alle Reader\/Writer-und InputStream\/OutputStream-Klassen<\/li>\n<li>void close() throws IOException schlie\u00dft den Datenstrom. Einen geschlossenen Strom noch einmal zu schlie\u00dfen hat keine Konsequenz<\/li>\n<li>Flushable findet wird nur bei schreibenden Klassen implementiert. Flushable ist insbesondere bei Klassen wichtig, die Daten puffern<\/li>\n<li>void flush() throws IOException schreibt gepufferte Daten in den Strom<\/li>\n<\/ul>\n<p>  <\/td>\n<p> <\/tr>\n<p> <\/p>\n<tr>  <\/p>\n<td>\n<ul>\n<li>Ein SequenceInputStream-Filter h\u00e4ngt mehrere Eingabestr\u00f6me zu einem gro\u00dfen Eingabestrom zusammen.<\/li>\n<li>N\u00fctzlich ist dies, wenn wir aus Str\u00f6men lesen wollen und es uns egal ist, was f\u00fcr ein Strom es ist, wo er startet und wo er aufh\u00f6rt.<\/li>\n<li>Der SequenceInputStream l\u00e4sst sich erzeugen, indem im Konstruktor zwei InputStream-Objekte mitgegeben werden.<\/li>\n<li>Soll aus zwei Dateien ein zusammengesetzter Datenstrom gebildet werden, benutzen wir folgende Programmzeilen:<br \/>InputStream s1 = new FileInputStream( &#8222;teil1.txt&#8220; );<br \/>InputStream s2 = new FileInputStream( &#8222;teil2.txt&#8220; );<br \/>InputStream s  = new SequenceInputStream( s1, s2 );<\/li>\n<li>Ein Aufruf irgendeiner read()-Methode liest nun erst Daten aus s1.<\/li>\n<li>Liefert s1 keine Daten mehr, kommen die Daten aus s2.<\/li>\n<li>Liegen keine Daten mehr an s2, aber wieder an s1, ist es zu sp\u00e4t.<\/li>\n<\/ul>\n<p>  <\/td>\n<p>  <\/p>\n<td>\n<ul>\n<li>Ein SequenceInputStream-Filterh\u00e4ngt mehrere Eingabestr\u00f6me zu einem gro\u00dfen Eingabestrom zusammen<\/li>\n<li>N\u00fctzlich ist dies, wenn wir aus Str\u00f6men lesen wollen und es uns egal ist, was f\u00fcr ein Strom es ist, wo er startet und wo er aufh\u00f6rt.<\/li>\n<li>Der SequenceInputStreaml\u00e4sst sich erzeugen, indem im Konstruktor zwei InputStream-Objekte mitgegeben werden<\/li>\n<li>Soll aus zwei Dateien ein zusammengesetzter Datenstrom gebildet<br \/>werden, benutzen wir folgende Programmzeilen:<br \/>InputStream s1 = newFileInputStream(\u201edatei1.txt&#8220;);<br \/>InputStream s2 = newFileInputStream(\u201edatei2.txt&#8220;);<br \/>InputStream s = newSequenceInputStream(s1, s2);<\/li>\n<li>Ein Aufruf irgendeiner read()-Methodeliest nun erst Daten aus s1<\/li>\n<li>Liefert s1keine Daten mehr, kommen die Daten aus s2<\/li>\n<li>Kommen keine Daten mehr von s2, aber wieder von s1 k\u00f6nnen diese nicht mehr verarbeitet werden<\/li>\n<\/ul>\n<p>  <\/td>\n<p> <\/tr>\n<p> <\/p>\n<tr>  <\/p>\n<td>\n<ul>\n<li>Swing bietet viel mehr Komponenten als AWT. Das AWT bietet zum Beispiel keine Tabellen oder B\u00e4ume. <\/li>\n<li>Schaltfl\u00e4chen und Labels nehmen Symbole auf, die sie beliebig um Text angeordnet darstellen. <\/li>\n<li>Swing-Komponenten k\u00f6nnen transparent und beliebig geformt sein; eine Schaltfl\u00e4che kann wie unter Mac OS X abgerundet sein. <\/li>\n<li>Jede Swing-Komponente kann einen Rahmen bekommen. <\/li>\n<li>AWT-Komponenten arbeiten nicht nach dem Model\/View-Prinzip, nach dem die Daten getrennt von den Komponenten gehalten werden. <\/li>\n<\/ul>\n<p>  <\/td>\n<p>  <\/p>\n<td>\n<ul>\n<li>Swing bietet viel mehr Komponenten als AWT, so bietet AWT zum Beispiel keine Tabellen oder B\u00e4ume<\/li>\n<li>Schaltfl\u00e4chen und Labels k\u00f6nnen Symbole aufnehmen, die sie beliebig um Text angeordnet darstellen<\/li>\n<li>Swing-Komponenten k\u00f6nnen transparent und beliebig geformt sein. Eine Schaltfl\u00e4che kann wie unter Mac OS X abgerundet sein.<\/li>\n<li>Jede Swing-Komponente kann einen Rahmen bekommen<\/li>\n<li>AWT-Komponenten arbeiten nicht nach dem Model\/View-Prinzip, nach dem die Daten getrennt von den Komponenten gehalten werden<\/li>\n<\/ul>\n<p>  <\/td>\n<p> <\/tr>\n<p> <\/p>\n<tr>  <\/p>\n<td>\n<ul>\n<li>Jeder Swing-Komponente kann mit der Methode setBorder() ein Rahmen zugewiesen werden. Ein Rahmen ist eine Klasse, die die Schnittstelle Border implementiert. Swing stellt einige Standardrahmen zur Verf\u00fcgung:<\/li>\n<li>AbstractBorder. Abstrakte Klasse, die die Schnittstelle minimal implementiert <\/li>\n<li>BevelBorder. (Eingelassener) 3D-Rahmen<\/li>\n<li>CompoundBorder. Rahmen, der andere Rahmen aufnehmen kann <\/li>\n<li>EmptyBorder. Rahmen, dem freier Platz zugewiesen werden kann <\/li>\n<li>EtchedBorder. Noch deutlicher markierter Rahmen <\/li>\n<li>LineBorder. Rahmen in einer einfachen Farbe in gew\u00fcnschter Dicke<\/li>\n<li>MatteBorder. Rahmen, der aus Kacheln von Icons besteht<\/li>\n<li>SoftBevelBorder. 3D-Rahmen mit besonderen Ecken<\/li>\n<li>TitledBorder. Rahmen mit einem String in einer gew\u00fcnschten Ecke<\/li>\n<\/ul>\n<p>  <\/td>\n<p>  <\/p>\n<td>\n<ul>\n<li>Jeder Swing-Komponente kann mit der Methode setBorder()ein Rahmen zugewiesen werden. Ein Rahmen ist eine Klasse, die das Interface Borderimplementiert. Swing stellt einige Standardrahmen zur Verf\u00fcgung:<\/li>\n<li>AbstractBorder Abstrakte Klasse, die die Schnittstelle minimal implementiert.<\/li>\n<li>BevelBorder (Eingelassener) 3D-Rahmen<\/li>\n<li>CompoundBorder Rahmen, der andere Rahmen aufnehmen kann<\/li>\n<li>EmptyBorder Rahmen, dem freier Platz zugewiesen werden kann<\/li>\n<li>EtchedBorder Noch deutlicher markierter Rahmen<\/li>\n<li>LineBorder Rahmen in einer einfachen Farbe in gew\u00fcnschter Dicke<\/li>\n<li>MatteBorder Rahmen, der aus Kacheln von Icons besteht<\/li>\n<li>SoftBevelBorder3D-Rahmen mit besonderen Ecken<\/li>\n<li>TitledBorder Rahmen mit einem String in einer gew\u00fcnschten Ecke<\/li>\n<\/ul>\n<p>  <\/td>\n<p> <\/tr>\n<p><\/table>\n<p><\/p>\n<p>Auch f\u00fcr zwei Beispiele durfte die Insel Vorlage sein. (Das ist rechtlich sicher, da die Insel im Vorwort erlaubt, dass alle Beispiele frei verwendet werden k\u00f6nnen.) Das eine ist JCheckBoxDemo, welches als CheckBoxDemo mit anderen Grafiken und Beschriftungen &#8212; aus der Auswahl &quot;Ein Colt f\u00fcr alle F\u00e4lle&quot; und &quot;MacGyver&quot; wird &quot;Informatik A und Informatik B&quot; &#8212; einer weiteren Zeile im Listener ein neues Leben f\u00fchrt.<\/p>\n<p><\/p>\n<p>Oder<\/p>\n<pre><pre>package com.javatutor.insel.thread.group;<br \/><br \/>public class ShowThreadsInMain<br \/>{<br \/> public static void main( <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/java\/lang\/String.html\">String<\/a>[] args )<br \/> {<br \/>   <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/java\/lang\/ThreadGroup.html\">ThreadGroup<\/a> top = <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/java\/lang\/Thread.html\">Thread<\/a>.currentThread().getThreadGroup();<br \/><br \/>   while ( top.getParent() != null )<br \/>     top = top.getParent();<br \/><br \/>   showGroupInfo( top );<br \/> }<br \/><br \/> public static void showGroupInfo( <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/java\/lang\/ThreadGroup.html\">ThreadGroup<\/a> group )<br \/> {<br \/>   <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/java\/lang\/Thread.html\">Thread<\/a>[] threads = new <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/java\/lang\/Thread.html\">Thread<\/a>[ group.activeCount() ];<br \/><br \/>   group.enumerate( threads, false );<br \/>   <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/java\/lang\/System.html\">System<\/a>.out.println( group );<br \/><br \/>   for ( <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/java\/lang\/Thread.html\">Thread<\/a> t : threads )<br \/>     if ( t != null )<br \/>       <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/java\/lang\/System.html\">System<\/a>.out.printf( \"%s -&gt; %s is %sDaemon%n\",<br \/>                          group.getName(), t, t.isDaemon() ? \"\" : \"no \" );<br \/><br \/>   <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/java\/lang\/ThreadGroup.html\">ThreadGroup<\/a>[] activeGroup = new <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/java\/lang\/ThreadGroup.html\">ThreadGroup<\/a>[ group.activeGroupCount() ];<br \/>   group.enumerate( activeGroup, false );<br \/>   for ( <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/java\/lang\/ThreadGroup.html\">ThreadGroup<\/a> g : activeGroup )<br \/>     showGroupInfo( g );<br \/> }<br \/>}<\/pre>\n<p><\/p>\n<p>Und das Beispiel vom Doktor:<\/p>\n<pre>package threadgroup1;<br \/><br \/>\/**<br \/>* Informationen ueber die laufenden Threads liefern.<br \/>*<br \/>* @author Ralf Kunze (rkunze@uos.de), Institut fuer Informatik, Universitaet<br \/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Osnabrueck<br \/>* @date 06.05.2007<br \/>*\/<br \/>public class ThreadInfo {<br \/> public static void main(String[] args) {<br \/>  ThreadGroup top = Thread.currentThread().getThreadGroup();<br \/><br \/>  while (top.getParent() != null)<br \/>   top = top.getParent();<br \/><br \/>  showGroupInfo(\"&nbsp;&nbsp;&nbsp; \",top);<br \/> }<br \/><br \/> public static void showGroupInfo(String indent, ThreadGroup group) {<br \/>  Thread[] threads = new Thread[group.activeCount()];<br \/><br \/>  group.enumerate(threads, false);<br \/>  System.out.println(indent + group);<br \/><br \/>  for (Thread t : threads)<br \/>   if (t != null)<br \/>    System.out.printf(\"%s%s -&gt; %s is %sDaemon%n\",<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; indent ,group.getName(), t, t.isDaemon() ? \"\" : \"no \");<br \/><br \/>  ThreadGroup[] activeGroup = new ThreadGroup[group.activeGroupCount()];<br \/>  group.enumerate(activeGroup, false);<br \/>  for (ThreadGroup g : activeGroup)<br \/>   showGroupInfo(indent+indent, g);<br \/> }<br \/>}<\/pre>\n<p>Das @author-Tag gef\u00e4llt mir besonders. Die indent-Erweiterung ist nat\u00fcrlich anzuerkennen. Das habe ich gleich \u00fcbernommen. Daher gef\u00e4llt mir der wissenschaftliche Austausch so sehr. Leider gibt es das JavaDoc-Tag @date nicht (zumindest bis Java 6), aber man kann ja schon f\u00fcr die Zukunft programmieren.<\/p>\n<p>Insgesamt finden sich sehr viele Abschnitte aus dem Kapitel IO, Thread, Reflection und Netzwerk in den Uni-Unterlagen, aber in der Reihenfolge, Satzbau und Formulieren sind auch in anderen Kapiteln deutliche \u00c4hnlichkeiten zu erkennen. Danke f\u00fcr die Hommage.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hier m\u00f6chte ich mich bei Ihnen, Herrn Dr. Ralf Kunze, und Team der Universit\u00e4t Osnabr\u00fcck herzlich bedanken. Es freut mich sehr, dass Sie f\u00fcr ihre Vorlesungsunterlagen http:\/\/www-lehre.inf.uos.de\/~binf\/2007\/index.html &#8222;Objekt-orientierte Programmierung in Java&#8220; im Sommersemester 2007 so viel Abschnitte der Insel gebrauchen konnten. Immer wieder begl\u00fcckt es mich, wenn Referenten und Dozenten Abschnitte 1:1 \u00fcbernehmen und damit [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1],"tags":[],"class_list":["post-91","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/91","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=91"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/91\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=91"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=91"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=91"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}