java 面試知識點筆記(七)多線程與併發 上篇

問:進程和線程的區別?java

進程是資源分配的最小單位,線程是CPU調度的最小單位編程

  • 全部與進程相關的資源,都被記錄在PCB中
  • 進程是搶佔處理器的調度單位;線程屬於某個進程,共享其資源
  • 線程只由堆棧寄存器、程序計數器和TCB組成

總結:多線程

  1. 線程不能看做獨立應用,而進程能夠看做獨立應用
  2. 進程由獨立的地址空間,互不影響,線程只是進程的不一樣執行路徑(一個線程掛掉了整個進程就掛掉了)
  3. 線程沒有獨立的地址空間,多進程的程序比多線程的程序健壯
  4. 進程的切換比線程的切換開銷大不少(因此作高併發的程序採用多線程開發)

 

  • 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接口
相關文章
相關標籤/搜索