- 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();
}
}
}
}



