- 我們先看一個最古老的多線程實現的服務端
public class SocketThread { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(9889); while (true) { Socket client = serverSocket.accept(); new Thread(() -> { try { System.out.println("client port :" + client.getPort()); InputStream inputStream = client.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); while (true) { System.out.println(bufferedReader.readLine()); } } catch (IOException e) { e.printStackTrace(); } }).start(); } } }
strace指令查看:
- 我們用【strace】指令檢測一下:
-o:輸出 到某個路徑
-ff: 抓取這個程序所有線程
[root@bogon thread]# strace -ff -o /root/data/thread-group/ooxx java SocketThread //程序對內核有沒有發生什么系統調用
然后可以再thread-group目錄中看到線程詳情:
jps進行查看
- 首先用【jps】指令查看一下進程詳情:
[root@bogon thread-group]# jps 12485 Jps 12475 Loop
- 然后我們進入【Loop】進程,繼續深入:
[root@bogon thread-group]# cd /proc/12475 [root@bogon 12475]# ls attr comm fd map_files net pagemap schedstat statm wchan autogroup coredump_filter fdinfo maps ns patch_state sessionid status auxv cpuset gid_map mem numa_maps personality setgroups syscall cgroup cwd io mountinfo oom_adj projid_map smaps task clear_refs environ limits mounts oom_score root stack timers cmdline exe loginuid mountstats oom_score_adj sched stat uid_map
1》然后我們進入【task】目錄,可以看到線程詳情:
[root@bogon 12475]# cd task/ [root@bogon task]# ls 12475 12476 12477 12478 12479 12480 12481 12482 12483 12484 [root@bogon task]# ll total 0 dr-xr-xr-x. 7 root root 0 May 27 10:08 12475 dr-xr-xr-x. 7 root root 0 May 27 10:08 12476 dr-xr-xr-x. 7 root root 0 May 27 10:08 12477 dr-xr-xr-x. 7 root root 0 May 27 10:08 12478 dr-xr-xr-x. 7 root root 0 May 27 10:08 12479 dr-xr-xr-x. 7 root root 0 May 27 10:08 12480 dr-xr-xr-x. 7 root root 0 May 27 10:08 12481 dr-xr-xr-x. 7 root root 0 May 27 10:08 12482 dr-xr-xr-x. 7 root root 0 May 27 10:08 12483 dr-xr-xr-x. 7 root root 0 May 27 10:08 12484
2》也可以進入【fd】目錄
以數字為文件描述符名字的文件
- 我們新開一個界面,可以用【nc】模擬一次客戶端請求:
[root@bogon ~]# nc 192.168.33.10 9889
此時可以看到連接情況的變化:
服務端會打印出客戶端連接進入的信息(此處我重新連了一下,所以和上述端口會產生不一致):
1》客戶端發送:
2》服務端接收: