- jps:列出正在运行的进程的pid, pnamejstack -l pid: 列出某个进程内的线程,包含用户线程,守护线程和其它线程,守护线程有编译线程和引用处理线程
C:UsersDELLOR>jps 5412 BootLanguagServerBootApp 10460 PipedIODemo 16140 17964 Jps C:UsersDELLOR>jstack -l 10460 2022-01-29 20:53:48 Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.261-b12 mixed mode): "DestroyJavaVM" #13 prio=5 os_prio=0 tid=0x00000247c1691000 nid=0x5f8 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "recieve" #12 prio=5 os_prio=0 tid=0x00000247d969d800 nid=0x38c8 in Object.wait() [0x000000c3029ff000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000000d64b3280> (a java.io.PipedInputStream) at java.io.PipedInputStream.read(Unknown Source) - locked <0x00000000d64b3280> (a java.io.PipedInputStream) at java.io.PipedInputStream.read(Unknown Source) - locked <0x00000000d64b3280> (a java.io.PipedInputStream) at java.io.InputStream.read(Unknown Source) at iopart.Recieve.run(PipedIODemo.java:61) at java.lang.Thread.run(Unknown Source) Locked ownable synchronizers: - None "send" #11 prio=5 os_prio=0 tid=0x00000247d969c800 nid=0x305c runnable [0x000000c3028fe000] java.lang.Thread.State: RUNNABLE at java.io.FileInputStream.readBytes(Native Method) at java.io.FileInputStream.read(Unknown Source) at java.io.BufferedInputStream.read1(Unknown Source) at java.io.BufferedInputStream.read(Unknown Source) - locked <0x00000000d6359a98> (a java.io.BufferedInputStream) at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) at sun.nio.cs.StreamDecoder.implRead(Unknown Source) at sun.nio.cs.StreamDecoder.read(Unknown Source) - locked <0x00000000d645ac98> (a java.io.InputStreamReader) at java.io.InputStreamReader.read(Unknown Source) at java.io.Reader.read(Unknown Source) at java.util.Scanner.readInput(Unknown Source) at java.util.Scanner.next(Unknown Source) at iopart.Send.run(PipedIODemo.java:27) at java.lang.Thread.run(Unknown Source) Locked ownable synchronizers: - None "Service Thread" #10 daemon prio=9 os_prio=0 tid=0x00000247d830e800 nid=0x8b0 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "C1 CompilerThread3" #9 daemon prio=9 os_prio=2 tid=0x00000247d82ee000 nid=0x3998 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "C2 CompilerThread2" #8 daemon prio=9 os_prio=2 tid=0x00000247d82e6800 nid=0x2344 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "C2 CompilerThread1" #7 daemon prio=9 os_prio=2 tid=0x00000247d82e0800 nid=0x3d94 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "C2 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x00000247d82de800 nid=0x2f8c waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x00000247d82de000 nid=0x2744 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x00000247d82dd000 nid=0x1464 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "Finalizer" #3 daemon prio=8 os_prio=1 tid=0x00000247d825a800 nid=0x32d8 in Object.wait() [0x000000c301ffe000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000000d6308ee0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(Unknown Source) - locked <0x00000000d6308ee0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(Unknown Source) at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source) Locked ownable synchronizers: - None "Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00000247d8239800 nid=0x2af0 in Object.wait() [0x000000c301efe000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000000d6306c00> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Unknown Source) at java.lang.ref.Reference.tryHandlePending(Unknown Source) - locked <0x00000000d6306c00> (a java.lang.ref.Reference$Lock) at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source) Locked ownable synchronizers: - None "VM Thread" os_prio=2 tid=0x00000247d8236000 nid=0x4334 runnable "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00000247c16a9000 nid=0x13bc runnable "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00000247c16aa000 nid=0x313c runnable "GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00000247c16ab800 nid=0xa88 runnable "GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00000247c16ae000 nid=0x1704 runnable "GC task thread#4 (ParallelGC)" os_prio=0 tid=0x00000247c16af000 nid=0x4254 runnable "GC task thread#5 (ParallelGC)" os_prio=0 tid=0x00000247c16b0000 nid=0x3458 runnable "GC task thread#6 (ParallelGC)" os_prio=0 tid=0x00000247c16b3000 nid=0x3300 runnable "GC task thread#7 (ParallelGC)" os_prio=0 tid=0x00000247c16b4000 nid=0x3284 runnable "VM Periodic Task Thread" os_prio=2 tid=0x00000247d9651000 nid=0x2c8c waiting on condition JNI global references: 5
管道流用于线程间传输数据,创建两个线程,一个线程向管道里写入从键盘输入的数据,另一个线程从管道里读取数据,并打印至控制台。
运行的进程为PipedIODemo,在此进程中创建了两个线程,名称为"send"和"recieve",表示发送线程和接收线程。进程和线程信息可使用jps和jstack查看。
package iopart; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.util.Scanner; public class PipedIODemo { public static void main(String[] args) { Send send = new Send(); Recieve recieve = new Recieve(); recieve.connect(send.getOut()); new Thread(send,"send").start(); new Thread(recieve,"recieve").start(); } } class Send implements Runnable{ PipedOutputStream out=new PipedOutputStream(); public PipedOutputStream getOut() { return out; } Scanner sc=new Scanner(System.in); @Override public void run() { String next = null; while(!"end".equalsIgnoreCase(next)) { next= sc.next(); try { out.write(next.getBytes()); } catch (IOException e) { e.printStackTrace(); } } try { if (out!=null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } } } class Recieve implements Runnable{ PipedInputStream in=new PipedInputStream(); public PipedInputStream getIn() { return in; } public void connect(PipedOutputStream out) { try { this.in.connect(out); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { byte[] bytes=new byte[1024]; while(true) { try { in.read(bytes); System.out.println(new String(bytes)); } catch (IOException e) { e.printStackTrace(); } } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)