Esto me parecio interesante de compartir:
Dada esta clase Stopping.java ( meterlo todo en un unico archivo, más facil para probar este ejemplo.):
import java.util.Timer;
import java.util.TimerTask;
class CanStop extends Thread {
private volatile boolean stop = false;
private int counter = 0;
public void run() {
while (!stop && counter < 10000) {
System.out.println(counter++) ;
try{
Thread.sleep(1000);
} catch (Exception e){
System.out.println(e);
}
}
if (stop)
System.out.println("Detected stop");
}
public void requestStop() {
stop = true;
}
}
public class Stopping {
public static void main(String[] args) {
final CanStop stoppable = new CanStop();
stoppable.start();
try{
Thread.sleep(20000);
} catch (Exception e){
System.out.println(e);
}
new Timer(true).schedule(new TimerTask() {
public void run() {
System.out.println("Requesting stop");
stoppable.requestStop();
}
}, 350);
}
}
Uds si la ejecutan , contara hasta 20 y se detendrá ( javac Stopping.java para compilar y luego para ejecutar java Stopping ), de paso el ejemplo de como detener un hilo desde afuera.. de manera muuuy simple.
Ahora, a lo nuestro; en otra consola ( esto es en un unix , el contexto de la mayoría de procesos java )... mientras se ejecuta el proceso de Stopping, pueden hacer:
ps -fea | grep Stopping
Que tiro en mi caso? :
711670932 29342 28674 0 12:41PM ttys001 0:00.16 /usr/bin/java Stopping
les va a tirar el pid del Proceso y luego
kill -3 29342
y van a ver el dump del proceso corriendo..
0
1
2
3
4
5
6
7
8
9
10
2015-02-12 12:41:12
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.45-b08 mixed mode):
"Thread-0" prio=5 tid=0x00007fce5a005000 nid=0x4f03 waiting on condition [0x000000011beb5000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at CanStop.run(Stopping.java:11)
"Service Thread" daemon prio=5 tid=0x00007fce5a813800 nid=0x4b03 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread1" daemon prio=5 tid=0x00007fce5a813000 nid=0x4903 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" daemon prio=5 tid=0x00007fce59804800 nid=0x4703 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=5 tid=0x00007fce5a800800 nid=0x4503 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=5 tid=0x00007fce5a00a000 nid=0x3103 in Object.wait() [0x000000011b6f3000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007aaa85568> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x00000007aaa85568> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)
"Reference Handler" daemon prio=5 tid=0x00007fce5a007000 nid=0x2f03 in Object.wait() [0x000000011b5f0000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007aaa850f0> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
- locked <0x00000007aaa850f0> (a java.lang.ref.Reference$Lock)
"main" prio=5 tid=0x00007fce5900c800 nid=0x1903 waiting on condition [0x000000010d366000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at Stopping.main(Stopping.java:28)
"VM Thread" prio=5 tid=0x00007fce5904d000 nid=0x2d03 runnable
"GC task thread#0 (ParallelGC)" prio=5 tid=0x00007fce59018000 nid=0x2503 runnable
"GC task thread#1 (ParallelGC)" prio=5 tid=0x00007fce59803000 nid=0x2703 runnable
"GC task thread#2 (ParallelGC)" prio=5 tid=0x00007fce59803800 nid=0x2903 runnable
"GC task thread#3 (ParallelGC)" prio=5 tid=0x00007fce59018800 nid=0x2b03 runnable
"VM Periodic Task Thread" prio=5 tid=0x00007fce59830000 nid=0x4d03 waiting on condition
JNI global references: 109
Heap
PSYoungGen total 76800K, used 2642K [0x00000007aaa80000, 0x00000007b0000000, 0x0000000800000000)
eden space 66048K, 4% used [0x00000007aaa80000,0x00000007aad14828,0x00000007aeb00000)
from space 10752K, 0% used [0x00000007af580000,0x00000007af580000,0x00000007b0000000)
to space 10752K, 0% used [0x00000007aeb00000,0x00000007aeb00000,0x00000007af580000)
ParOldGen total 174592K, used 0K [0x0000000700000000, 0x000000070aa80000, 0x00000007aaa80000)
object space 174592K, 0% used [0x0000000700000000,0x0000000700000000,0x000000070aa80000)
PSPermGen total 21504K, used 2551K [0x00000006fae00000, 0x00000006fc300000, 0x0000000700000000)
object space 21504K, 11% used [0x00000006fae00000,0x00000006fb07dcb0,0x00000006fc300000)
11
12
13
14
15
16
17
Interesante cuando uno esta probando procesos concurrentes en java..