1. 程式人生 > 其它 >Java程序和執行緒

Java程序和執行緒

Java程序和執行緒

任務A執行I/O操作時,去執行任務B。
程序獨佔記憶體空間,執行緒共享程序的記憶體資源。

一、區別

程序時資源分配的最小單位,執行緒時CPU排程的最小單位
1、執行緒屬於某個程序,共享其資源
2、執行緒只有堆疊暫存器、程式計數器和執行緒控制表(TCB)組成---執行緒的搶佔 CAS自旋 JMM 結合思考

二、總結

每一個Java程序對應一個JVM例項,多個執行緒共享JVM的堆
Java是單執行緒程式設計模型,程式只會建立一個主執行緒,UI程式設計時耗時操作放在子執行緒中
一個程式是一個可執行的檔案,一個程序是一個執行例項
JVM是多執行緒的,它有例如GC執行緒等等執行緒

三、執行緒的start和run方法的區別

呼叫start()會建立一個新的子執行緒並啟動run();
run()只是一個Thread的普通方法呼叫,在主執行緒中呼叫即主執行緒為呼叫者。

四、Thread和Runnable的關係

Thread實現了Runnable介面,使得run方法支援多執行緒
由於Java是單一整合原則,推薦使用Runnable介面

五、如何處理執行緒的返回值

1、如何給run()傳參

建構函式傳參、成員變數傳參、回撥函式傳參

2、如何實現處理執行緒的返回值

一、主執行緒等待法
二、使用Thread類的join()阻塞當前執行緒以等待子執行緒處理完畢
三、通過Callable介面實現:通過FutureTask Or 執行緒池獲取
FutureTask配套使用isDone()和get()方法;
或者可行的ExecutorService.submit(Callable),提一下不可行的Executor.execute(Runnable)。

六、執行緒的狀態

六個狀態
1、new,建立後尚未啟動(start)
2、runnable,包含作業系統中的Ready->Running兩種狀態
3、waiting(無限期),不會被分配CPU執行時間,需要顯示喚醒
new Object.wait()&&Thread.join()未設定Timeout引數||LockSupport.park()
4、timed waiting(限期等待),一定時間後系統自定喚醒
Thread.sleep()||new Object.wait()&&Thread.join()設定Timeout引數||LockSupport.parkNanos()||LockSupport.parkUntil()
5、blocked(阻塞),等待獲取排它鎖
6、Terminated,已終止執行緒狀態,執行緒已經結束執行

七、sleep和wait的區別

1、Thread.sleep(),new Object.wait()兩者所屬不同
2、Thread.sleep()可以在任何位置使用
3、new Object.wait()只能在synchronized方法或者synchronized塊中使用
4、new Object.wait()讓出CPU並釋放鎖,Thread.sleep()只會讓出CPU不會釋放鎖

八、notify和notifyAll的區別

1、鎖池和等待池

鎖池:執行緒A呼叫的某個物件被上鎖,其他執行緒同樣想取到鎖住的程式碼時,這些執行緒會進入鎖池
等待池:執行緒A呼叫某個物件的wait()方法,執行緒A就會釋放該物件的鎖,執行緒A進入等待池,並不去競爭物件的鎖

2、區別

notifyAll()所有處於等待池中的執行緒全部進入鎖池去競爭獲取鎖的機會
notify()只會隨機選取一個處於等待池中執行緒進入鎖池去競爭獲取鎖的機會

九、yield()

1、當呼叫Thread.yield()函式時,會給執行緒排程器一個當前執行緒願意讓出CPU的暗示,但排程器可能會忽略這個暗示。
2、對鎖的行為不會有影響

十、interrupt()

通知執行緒應該中斷

1、如果執行緒處於被阻塞狀態(不僅限於blocked),執行緒立即退出阻塞狀態,並丟擲InterruptException異常。
2、如果執行緒處於正常活動狀態,執行緒中斷標誌設為true,執行緒正常執行,不受影響。

十一、執行緒狀態總結

stateDiagram state "Thread t = new Thread()" as 新建 state "runable" as 可執行 state "obtain my timeslice, running" as 執行 state "dead thread doesn't start once" as 死亡 state "doesn't release any lock or monitor" as 阻塞 state "lock pool" as 鎖池 state "release lock or monitor" as 等待佇列 note left of 新建 執行緒狀態圖 end note 新建 --> 可執行:t.start() 可執行 --> 執行:OS選中 執行 --> 可執行:1、時間片用完 2、Thread().yield() 執行 --> 阻塞:1、I/O操作等待使用者輸入 2、Thread.sleep() 阻塞 --> 可執行:1、I/O操作使用者輸入完成 2、sleep()時間結束 執行 --> 死亡:1、run()、main()結束 2、異常退出 執行 --> 等待佇列:lock.wait() 執行 --> 鎖池:synchronized(lock) 鎖池 --> 可執行:拿到鎖標識 等待佇列 --> 鎖池:被其他執行緒喚醒:lock.notify()或lock.notifyAll()