問:進程和線程的區別?java
進程是資源分配的最小單位,線程是CPU調度的最小單位編程
- 全部與進程相關的資源,都被記錄在PCB中
- 進程是搶佔處理器的調度單位;線程屬於某個進程,共享其資源
- 線程只由堆棧寄存器、程序計數器和TCB組成
總結:多線程
- 線程不能看做獨立應用,而進程能夠看做獨立應用
- 進程由獨立的地址空間,互不影響,線程只是進程的不一樣執行路徑(一個線程掛掉了整個進程就掛掉了)
- 線程沒有獨立的地址空間,多進程的程序比多線程的程序健壯
- 進程的切換比線程的切換開銷大不少(因此作高併發的程序採用多線程開發)
- java對操做系統提供的功能進行封裝,包括進程和線程
- 運行一個程序會產生一個進程,進程包含至少一個線程
- 每個進程對應一個JVM實例,多個線程共享JVM裏的堆
- java採用單線程編程模式,程序自動建立主線程
- 主線程能夠建立子線程,原則上要後於子線程完成執行
問:Thread中start和run方法的區別?併發
直接看源碼jvm
這是一個本地方法高併發
去openjdk裏面查看 java/lang/Thread.c操作系統
start0方法調用了JVM_StartThread線程
再去vm/prims/jvm.cpp查看JVM_StartThread方法3d
方法裏面代碼不少 最關鍵的是看new JavaThread方法 傳入了thread_entryblog
thread_entry裏面主要是 call虛擬機傳入run方法名字 就是new一個線程並執行run方法裏面的內容
總結:
- 調用start()方法會建立一個新的子線程並啓動
- run()方法只是Thread的一個普通方法調用
start是
run是
問:Thread和Runnable是什麼關係?
- Thread是實現了Runnable接口的類,使用run支持多線程
- 因類的單一繼承原則,推薦多使用Runnable接口