AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

面試中如何答好:線程

來源: 責編: 時間:2023-10-16 17:08:12 271觀看
導讀1.進程是操作系統為應用程序分配資源的基本單位,比如操作系統會為一個應用程序分配獨立的工作空間,硬件資源,任務調度等。一個應用程序就是一個進程。2.線程是cpu執行的基本單位,可以理解為一個基本的執行流,一個進程中至

1.進程

是操作系統為應用程序分配資源的基本單位,比如操作系統會為一個應用程序分配獨立的工作空間,硬件資源,任務調度等。一個應用程序就是一個進程。f8k28資訊網——每日最新資訊28at.com

f8k28資訊網——每日最新資訊28at.com

2.線程

是cpu執行的基本單位,可以理解為一個基本的執行流,一個進程中至少有一個線程。進程是線程的集合體或者載體。f8k28資訊網——每日最新資訊28at.com

3.線程模型

線程分為內核線程和用戶線程。f8k28資訊網——每日最新資訊28at.com

內核線程就是操作系統自己實現的一套線程機制,實現一套線程機制并不是像java一樣創建一個Thread對象即可,而是除了創建線程對象,還要基于操作系統及硬件的不同(比如cpu是多核單核等),制定何時凍結或喚醒線程、該給線程分配多少處理器執行時間、該把線程安排給哪個處理器核心去執行等事宜,而內核實現了這一套機制。f8k28資訊網——每日最新資訊28at.com

用戶線程就是用戶程序中創建的線程,和內核線程一樣,線程是交給處理器執行,但是具體的執行和分配機制需要用戶程序自己實現,就是說也要根據機器的不同實現一套線程運行機制才行。但是實現這樣一套機制是極其復雜的,而且還要考慮不同的機器平臺,所以說有一定的困難度。f8k28資訊網——每日最新資訊28at.com

那我們開發的應用程序線程是怎么實現的呢,一般的應用程序實現的線程根據其特點可以分為三種:f8k28資訊網——每日最新資訊28at.com

  • 用戶線程和內核一一對應的1:1模型
  • 用戶線程和進程多對一的1:N模型
  • 用戶線程和內核線程多對多的M:N模型

(1) 1:1模型

應用程序創建一個線程實際上是通過內核提供的內核線程api調用與一個內核線程建立一比一映射關系,也就是說看起來應用程序創建了用戶線程,但其實應用程序只是創建線程對象,通過線程對象調用了內核api創建了內核線程,對于應用程序來說就比較省事了,因為具體的線程機制都是由內核完成。f8k28資訊網——每日最新資訊28at.com

這種模型免不了用戶態到內核態的切換,性能方面會被限制。f8k28資訊網——每日最新資訊28at.com

(2) 1:N模型

就是上面所說的,由用戶程序自己實現線程機制,包括線程創建,線程調度等。f8k28資訊網——每日最新資訊28at.com

這種模型基本能避免用戶態到內核態的切換,這就可以支持更多的線程并發,不好的地方就是實現困難。f8k28資訊網——每日最新資訊28at.com

(3) M:N模型

就是用戶程序中的用戶線程和內核線程不是一比一映射,而是多條用戶線程對應一條內核線程或者多條內核線程。f8k28資訊網——每日最新資訊28at.com

這種模型既能夠保證并發量,提高性能,又能利用內核的調度機制,但是免不了自己實現一套線程機制,依然具備很高的復雜性。f8k28資訊網——每日最新資訊28at.com

java在實現線程機制這條路上可以說對于三種模型都曾有過實現。其實采用哪種線程模型依賴于所使用的操作系統是否支持,就拿Hotspot這款虛擬機來說,它在不同操作系統上的實現就不一樣,在Solaris平臺的HotSpot虛擬機,由于操作系統的線程特性本來就可以同時支持 1:1及N:Mf8k28資訊網——每日最新資訊28at.com

但是主流的java虛擬機hotspot在主流的操作系統win和linux,采用的都是1:1模型。即線程調度交個內核來完成,這樣我們在創建線程的時候就受到了資源的很大限制,比如我們無法做到創建大批量的線程出來。f8k28資訊網——每日最新資訊28at.com

舉個例子:f8k28資訊網——每日最新資訊28at.com

內核是一個國有工廠負責加工產品,cpu是加工產品的機器,一個用戶程序就是一個私有企業,也就是一個進程,而線程就是私企和國企里面的工作人員。每個私企員工都會將一定的原材料送到國企進行加工。f8k28資訊網——每日最新資訊28at.com

1:1模型中,每當一個私企員工攜帶原材料來加工,都會有一個國企的員工接待,負責加工流程中的所有事情,直到加工完成并將私企員工送走。因為有很多私企,一個私企里面有很多私企員工,而國企員工相對較少,這樣一對一的服務,如果私企的人來的太多,會把國企人員累死,整個生產線會癱瘓。f8k28資訊網——每日最新資訊28at.com

1:N模型中就是每個私企在國企里面租一臺機器的使用時間,就是某個時間段,由某個私企承包,這個時間段內機器只為這個私企工作,這種情況下只要在這個時間段內,私企想派多少人去加工就派多少人去加工。f8k28資訊網——每日最新資訊28at.com

M:N模型中,某個私企大概有100人攜帶原材料加工,私企感覺這樣效率有點低,就想了個辦法,和國企達成某種協議,讓國企出幾個人專門服務于私企的這100個人,這樣效率會提升了。f8k28資訊網——每日最新資訊28at.com

4.線程調度

多線程情況下,能夠讓每個線程都能有條不紊的得到運行就是線程調度。f8k28資訊網——每日最新資訊28at.com

我們知道cpu處理器是單線流水運行,線程是運行在cpu上的,一個時間點上只會有一條線程正在被cpu運行。f8k28資訊網——每日最新資訊28at.com

基于以上情況,線程要如何調度呢,一般情況下,操作系統有兩種調度方式:f8k28資訊網——每日最新資訊28at.com

(1) 協同式調度

正在執行的線程自己控制自身的執行時間,并且當前線程執行完后由自身告知操作系統可以調度到其他線程上了。f8k28資訊網——每日最新資訊28at.com

這種方式相對來說實現簡單,不用考慮同步的問題。f8k28資訊網——每日最新資訊28at.com

但是缺點也很明顯,這種調度方式中有兩個點要注意,線程多長時間可以執行完?線程一定能通知操作系統調度其他線程嗎?這兩點無法保證的話就會引發一些問題,比如當前線程本身運行時間很長,執行邏輯中有一些io等待操作,這就造成cpu是空閑的,資源大大浪費;再比如如果代碼或者業務邏輯出了問題稍有不慎就會造成無法通知操作系統調度其他線程,這個是災難性的。f8k28資訊網——每日最新資訊28at.com

(2) 搶占式調度

由操作系統為每個線程分配操作時間,并且由操作系統自主負責調度其他線程。f8k28資訊網——每日最新資訊28at.com

cpu處理整個過程被分成若干個極小的時間片段,每個線程可以被分配多個時間片段。然后操作系統會按照分配情況進行調度。f8k28資訊網——每日最新資訊28at.com

這種方式可以讓所有的線程看起來是同時運行的,即便有一條線程出了問題,也不會影響其他線程。f8k28資訊網——每日最新資訊28at.com

主流的平臺linux的內核線程都是搶占式調度,這種方式的缺點就是接下來要說的上下文切換。f8k28資訊網——每日最新資訊28at.com

4.線程上下文切換

當處理器要運行線程時,除了運行代碼外還要有上下文數據的支撐。而這里說的“上下文”,以程序員的角度來看,是方法調用過程中的各種局部的變量與資源;以線程的角度來看,是方法的調用棧中存儲的各類信息;而以操作系統和硬件的角度來看,則是存儲在內存、緩存和寄存器中的一個個具體數值。f8k28資訊網——每日最新資訊28at.com

物理硬件的各種存儲設備和寄存器是被操作系統內所有線程共享的資源,比如線程A正在運行,線程B正在掛起等待運行,此時線程A的時間片段運行完畢了,線程B就會被調度。從線程A切換到線程B去執行之前,操作系統首先要把線程A的上下文數據妥善保管好,然后把寄存器、內存分頁等恢復到線程B掛起時候的狀態,這樣線程B被重新激活后才能仿佛從來沒有被掛起過。這種保護和恢復現場的工作,免不了涉及一系列數據在各種寄存器、緩存中的來回拷貝,這便是上下文切換,同時這個操作不是一個輕量級的操作,你想每個時間片段是很短的,也就意味著短時間內要做大量的上下文切換,這就一定會造成很大的時間消耗。f8k28資訊網——每日最新資訊28at.com

說到這里,java開發中的線程是java線程和內核線程一比一映射的1:1線程模型,一般java運行在linux系統,所以java開發中常遇到的性能影響點是”用戶態轉換內核態和上下文切換“。f8k28資訊網——每日最新資訊28at.com

5.java線程

java中的線程類是Thread,它定義了java層面線程創建,線程操作的一些列方法。f8k28資訊網——每日最新資訊28at.com

java中線程實現有三種方式:f8k28資訊網——每日最新資訊28at.com

//1.繼承threadStudent extends ThreadStudent xiaoming = new Student("小明",punishment);xiaoming.start();//2.實現RunnableStudent implements RunnableThread xiaoming = new Thread(new Student("小明",punishment),"小明");xiaoming.start();//3.任務FutureTask實現public static class CallerTask implements Callable<String>{@Overridepublic String call() throws Exception{return "hello";}}public static void main(String[] args) {//創建異步任務FutureTask<String> futureTask = new FutureTask<>(new CallerTask ());new Thread(futureTask).start();try{String result=futureTask.get();}catch(){e.printStackTrace();}}
  • 第一種方式繼承Thread類,所以子類也是一個Thread類,這樣子類是一個攜帶任務的線程類,任務和線程牢牢綁在一起不可分割,且子類繼承Thread類,就再也不能繼承其他類。
  • 第二種方式,Runnable是任務類,子類實現Runnable后依然是一個任務類,而且還能實現其他的類,這種方式中任務和線程隔離,一個任務可以被多個線程執行。符合java職責分離的設計原則和面向接口編程的原則。

以上兩種方式均沒有返回值,而第三種方式可以支持返回值,后面我們細講FutureTask。f8k28資訊網——每日最新資訊28at.com

我們來解析一下上面的前兩種方式:f8k28資訊網——每日最新資訊28at.com

Thread是java中的線程實體類,Runable是任務實體類,他們兩個的關系為,Runable代表任務,Thread代表任務的載體,以上面的例子來說,Thread就是企業內的工作人員,而Runable是具體的加工任務。f8k28資訊網——每日最新資訊28at.com

public interface Runnable {    public abstract void run();}

Runnable是一個接口,run是任務方法,自定一個類并實現Runnable類,然后重寫run方法定義具體的任務邏輯,這個類就是一個具體的任務類。f8k28資訊網——每日最新資訊28at.com

任務類自身不能運行,需要依賴載體。f8k28資訊網——每日最新資訊28at.com

public class Thread implements Runnable {     private Runnable target;          public Thread() {     }          public Thread(Runnable target) {        this.target = target;     }        @Override    public void run() {        if (target != null) {            target.run();        }    }         public synchronized void start() {               if (threadStatus != 0)            throw new IllegalThreadStateException();              group.add(this);        boolean started = false;        try {            start0();            started = true;        } finally {            try {                if (!started) {                    group.threadStartFailed(this);                }            } catch (Throwable ignore) {                          }        }    }           }

Thread線程作為任務的載體,通過實現Runnable而具備攜帶任務的能力,通過源碼可知,這個任務邏輯可以來自于自身,也可以來自外界傳進來的任務實體Runnable。f8k28資訊網——每日最新資訊28at.com

Thread線程除了可以攜帶任務,更重要的是能夠驅動任務運行,start方法就是啟動開關,其內部是本地方法,由jvm內部實現,不難想象這個方法的底層一定是調用了內核線程api,與內核線程做映射,然后jvm回調java中的run方法。f8k28資訊網——每日最新資訊28at.com

6.java線程狀態

java中的線程具有六種狀態。f8k28資訊網——每日最新資訊28at.com

  • 新建(New):創建后尚未啟動的線程處于這種狀態。
  • 運行(Runnable):包括操作系統線程狀態中的Running和Ready,也就是處于此狀態的線程有可能正在執行,也有可能正在等待著操作系統為它分配執行時間。
  • 等待(Waiting):處于這種狀態的線程不會被分配處理器執行時間,它們要等待被其他線喚醒。一般在調用wait方法和sleep方法的時候處于這種狀態。
  • 阻塞(Blocked):線程被阻塞了,“阻塞狀態”與“等待狀態”的區別是“阻塞狀態”在等待著獲取到一個排它鎖,這個事件將在另外一個線程放棄這個鎖的時候發生;而“等待狀態”則是在等待一段時間,或者喚醒動作的發生。在程序等待進入同步區域的時候,線程將進入這種狀態。
  • 結束(Terminated):已終止線程的線程狀態,線程已經結束執行。

7.java 線程 API

睡眠public static native void sleep(long millis);獲取當前線程對象public static native Thread currentThread();讓出cpupublic static native void yield();設置優先級public final void setPriority(int newPriority);阻塞等待執行完成public final void join();設置為守護線程public final void setDaemon(boolean on);讓可中斷方法中斷public void interrupt();獲取中斷位狀態public static boolean interrupted();獲取中斷位狀態,并重置public boolean isInterrupted();

這些方法有一些不是很常用,所以了解即可,重點說一下join,interrupt,interrupted,isInterrupted。f8k28資訊網——每日最新資訊28at.com

join方法是一個成員方法,調用某個線程的join方法,會讓主線程一直處于wait狀態(join方法底層源碼中通過不斷調用wait方法實現),等待這個線程處理完成再繼續執行下去。f8k28資訊網——每日最新資訊28at.com

interrupt是一個成員方法,這個方法會中斷靜止線程,而運行中的線程只能被設置為可中斷標志位為true,怎么理解呢?就是說如果線程處于sleep、wait狀態,這個時候調用interrupt會把這個阻塞狀態喚醒并拋出異常,之后該線程繼續運行,如果線程正在運行中(非Waiting狀態),此時調用interrupt只會給線程的可中斷狀態設置為true,對線程運行不會有任何影響。f8k28資訊網——每日最新資訊28at.com

調用某個線程的interrupt方法,給線程設置可中斷狀態的意義是什么呢?因為線程運行過程中可能正在處理數據,這個時候如果人為中斷線程是不安全的,所以要等到線程處于一個安全位置中斷才比較合理,那什么時候才是安全的位置呢,這個程序員自己決定,當處于安全位置的時候給一個可中斷標示,這樣中斷的時候判斷一下可中斷狀態再決定是否中斷即可。juc源碼中隨處可見該方法的應用。f8k28資訊網——每日最新資訊28at.com

上面說了中斷的時候判斷一下可中斷的狀態,interrupted這個方法就是獲取線程的中斷狀態,而isInterrupted方法也是獲取線程的可中斷狀態,不同點在于isInterrupted方法在獲取中斷狀態后,會順便把中斷狀態重置為false。f8k28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-13370-0.html面試中如何答好:線程

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 應對流量高峰的利器——消息中間件

下一篇: 使用Docker Swarm進行容器化高可用性的區塊鏈節點

標簽:
  • 熱門焦點
  • 官方承諾:K60至尊版將會首批升級MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版將會搭載天璣9200+處理器和獨顯芯片X7的同時,Redmi給出了官方承諾,K60至尊重大更新首批升級,會首批推送MIUI 15。也就是說雖然
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經過去,最明顯的肯定就是大內存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • 一年經驗在二線城市面試后端的經驗分享

    忠告這篇文章只適合2年內工作經驗、甚至沒有工作經驗的朋友閱讀。如果你是2年以上工作經驗,請果斷劃走,對你沒啥幫助~主人公這篇文章內容來自 「升職加薪」星球星友 的投稿,坐
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業發布的ESG報告。ESG是&ldquo;環境保
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 小米公益基金會捐贈2500萬元馳援北京、河北暴雨救災

    8月2日消息,今日小米科技創始人雷軍在其微博上發布消息稱,小米公益基金會宣布捐贈2500萬元馳援北京、河北暴雨救災。攜手抗災,京冀安康!以下為公告原文
  • 英特爾Xe-HP項目終止,將專注Xe-HPC/HPG系列顯卡

    據10 月 31 日消息報道,英特爾高級副總裁兼加速計算系統和圖形事業部總經理 表示,Xe-HP“ Arctic Sound” 系列服務器 GPU 已經應用于 oneAPI devcloud 云服
Top