線程基礎、線程之間的共享和協作
(目前會將一些概念簡單描述,一些重點的點會詳細描述)
1,CPU核心數和線程數之間的關係
①、一塊CPU只有一塊處理器
②、Inter提出了多核處理器
③、CPU核心數 和 線程數 是 1:1 的關係
④、Inter提出了超線程,CPU核心數 和 線程數 是 1:2 的關係
⑤、CPU同一時間只能運行16個線程
2、CPU時間片輪轉機制
①、RR調度:首先將所有就緒的隊列按FCFS策略排成一個就緒隊列,然後系統設置一定的時間片,每次給隊首作業分配時間片。如果此作業運行結束,即使時間片沒用完,立刻從隊列中去除此作業,並給下一個作業分配新的時間片;如果作業時間片用完沒有運行結束,則將此作業重新加入就緒隊列尾部等待調度。
②、CPU時間片輪轉機制可能會導致上下文切換。
3、什麼是進程和線程?
①、進程是程序運行資源分配的最小單位。進程內部有多個線程,會共享這個進程中的資源。
②、線程是CPU調度的最小單位。必須依賴進程而存在。
4、並行和併發的區別?
①、並行:同一時刻,可同時處理問題的能力。比如售票窗口多開,多開的窗口表示同時處理的能力。
②、併發:與單位時間相關,在單位時間內處理事情的能力。
5、高併發編程的意義、好處和注意事項
①好處:充分利用CPU資源,加快用戶響應時間,程序模塊化,異步化。
②問題:A、線程共享資源,存在衝突;B、容易導致死鎖;C、啓用太多線程,可能會搞垮機器。
6、學習多線程
①、Java裏的程序天生就是多線程的。
A、ThreadMXBean是Java虛擬機爲我們提供線程管理的接口,通過該類可以拿到應用中有多少個線程。
B、至少會運行5個線程:
1、main主函數線程
2、Reference Handler負責清除引用的線程
3、Finalizer調用對象的Final方法的線程
4、Signal Dispatcher分發,處理髮送給虛擬機信號的線程
5、Attach Listener獲取當前程序運行相關信息
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
public class OnlyMain {
public static void main(String[] args) {
// Java虛擬機 爲我們提供的線程裏面,線程管理的接口,通過該類可以拿到應用程序裏面有多少個線程
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
// 是否看鎖,這裏不看鎖,一般用不到,返回值是ThreadInfo的數組
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
// 遍歷數組
for (ThreadInfo threadInfo : threadInfos) {
/**
* main主函數線程
* Reference Handler負責清除引用的線程
* Finalizer調用對象的Final方法的線程
* Signal Dispatcher分發,處理髮送給虛擬機信號的線程
* Attach Listener獲取當前程序運行相關信息
*/
System.out.println("【" + threadInfo.getThreadId() + "】 " + threadInfo.getThreadName());
}
}
}
控制檯輸出:
【5】 Attach Listener
【4】 Signal Dispatcher
【3】 Finalizer
【2】 Reference Handler
【1】 main
C、實現多線程的三種方式及區別:
1、繼承Thread類
2、實現Runnable接口
3、實現Callable接口,允許有返回值,並且不能直接用new Thread來啓動該多線程接口對象,而是需要先用FutureTask對象來轉換一次,再調用new Thread()來啓動Callable多線程對象
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class NewThread {
/* 擴展自Thread類 */
/* 實現Runnable接口 */
private static class UseRunnable implements Runnable {
@Override
public void run() {
System.out.println("It is a Runnable!");
}
}
/* 實現Callable接口,允許有返回值 */
private static class UseCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("It is a Callable!");
return "CallableResult";
}
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
// 實例化Runnable接口對象
UseRunnable useRunnable = new UseRunnable();
// 通過new Thread來執行Runnable多線程對象
new Thread(useRunnable).start();
// 實例化Callable接口對象
UseCallable useCallble = new UseCallable();
// Thread不能夠運行Callable接口對象,只能通過FutureTask接口轉換後在運行
FutureTask<String> futureTask = new FutureTask<>(useCallble);
new Thread(futureTask).start();
System.out.println(futureTask.get());
}
}
控制檯輸出:
It is a Runnable!
It is a Callable!
CallableResult
來自享學IT教育課後總結。