JavaRush /Java-Blog /Random-DE /Wie erhalte ich eine Liste toter Threads von einer Thread...
Dead_MOPO3
Level 36
Москва

Wie erhalte ich eine Liste toter Threads von einer ThreadGroup? Stufe 28

Veröffentlicht in der Gruppe Random-DE
Eigentlich steht die Frage schon im Titel. Wer hat es herausgefunden, sag es mir. Ich habe diese Option gefunden, aber sie gefällt mir überhaupt nicht und sie funktioniert nicht.) public static void main(String[] args) { /* * For testing purposes */ ThreadGroup tg = new ThreadGroup( "MyThreadGroup" ); Thread subThread = new Thread( tg, "New Thread - Inactive" ); try { /* * GETTING THREADS - PROBABLY BETTER TO GET IT BY USING * getDeclaredFields() AND LOOPING TILL GET ONE OF TYPE * Thread[] SINCE A FUTURE VERSION MIGHT CHANGE THE NAME * BUT SINCE IS PACKAGE-LEVEL ACCESS, IT'S PROBABLY USED * ELSEWHERE IN THE PACKAGE, AND THIS IS JUST AN EXAMPLE */ Field field = tg.getClass().getDeclaredField( "threads" ); //NEED TO SUPPRESS ACCESS CHECKS field.setAccessible( true ); //EVEN IF SECURITY IS OFF YOU NEED THIS!!!! Thread[] tgThreads = ( Thread[] ) field.get( tg ); for ( int i = 0; i < tgThreads.length; i++ ) { if ( tgThreads[ i ] != null ) System.out.println( tgThreads[ i ].getName() + " = " + tgThreads[ i ].isAlive() ); } } catch (NoSuchFieldException nsfe) { nsfe.printStackTrace(); } catch (IllegalAccessException iae) { iae.printStackTrace(); } } Es stellt sich heraus, dass die Zeile Thread[] tgThreads = ( Thread[] ) field.get( tg ); für mich kein Array generiert. Ich habe gelesen, dass es so aussieht, als ob Sie irgendwie in System.SecurityManager gehen und ReflectPermission("suppressAccessChecks") festlegen können. aber der Ansatz ist zu hartcodiert. Durch Reflexion zu privaten Feldern gelangen...
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION