多線程學習-day-01多線程基礎

線程基礎、線程之間的共享和協作

(目前會將一些概念簡單描述,一些重點的點會詳細描述)

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教育課後總結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章