中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java面試問題——線程全面詳解總結

發布時間:2020-04-02 14:27:05 來源:網絡 閱讀:308 作者:愛碼仕i 欄目:編程語言

Java面試問題——線程全面詳解總結

一、多線程是什么?為什么要用多線程?

介紹多線程之前要介紹線程,介紹線程則離不開進程。

首先進程 :是一個正在執行中的程序,每一個進程執行都有一個執行順序,該順序是一個執行路徑,或者叫一個控制單元;

線程:就是進程中的一個獨立控制單元,線程在控制著進程的執行。一個進程中至少有一個進程。

多線程:一個進程中不只有一個線程。

為什么要用多線程

  • 為了更好的利用cpu的資源,如果只有一個線程,則第二個任務必須等到第一個任務結束后才能進行,如果使用多線程則在主線程執行任務的同時可以執行其他任務,而不需要等待;
  • 進程之間不能共享數據,線程可以;
  • 系統創建進程需要為該進程重新分配系統資源,創建線程代價比較小;
  • Java語言內置了多線程功能支持,簡化了java多線程編程。

二、線程的生命周期:

新建 :從新建一個線程對象到程序start() 這個線程之間的狀態,都是新建狀態;

就緒 :線程對象調用start()方法后,就處于就緒狀態,等到JVM里的線程調度器的調度;

運行 :就緒狀態下的線程在獲取CPU資源后就可以執行run(),此時的線程便處于運行狀態,運行狀態的線程可變為就緒、阻塞及死亡三種狀態。

等待/阻塞/睡眠 :在一個線程執行了sleep(睡眠)、suspend(掛起)等方法后會失去所占有的資源,從而進入阻塞狀態,在睡眠結束后可重新進入就緒狀態。

終止 :run()方法完成后或發生其他終止條件時就會切換到終止狀態。

三、創建線程的方法(還有其他方法):

1、繼承Thread類:

步驟: 、定義類繼承Thread;

  • 復寫Thread類中的run方法;

目的:將自定義代碼存儲在run方法,讓線程運行

  • 調用線程的start方法:

該方法有兩步:啟動線程,調用run方法。

2、實現Runnable接口:接口應該由那些打算通過某一線程執行其實例的類來實現。類必須定義一個稱為run 的無參方法。

實現步驟: 、定義類實現Runnable接口

  • 覆蓋Runnable接口中的run方法
    將線程要運行的代碼放在該run方法中。
  • 通過Thread類建立線程對象。
  • 將Runnable接口的子類對象作為實際參數傳遞給Thread類的構造函數。
    自定義的run方法所屬的對象是Runnable接口的子類對象。所以要讓線程執行指定對象的run方法就要先明確run方法所屬對象
  • 調用Thread類的start方法開啟線程并調用Runnable接口子類的run方法。

3、通過Callable和Future創建線程:

實現步驟

  • 創建Callable接口的實現類,并實現call()方法,改方法將作為線程執行體,且具有返回值。
  • 創建Callable實現類的實例,使用FutrueTask類進行包裝Callable對象,FutureTask對象封裝了Callable對象的call()方法的返回值
  • 使用FutureTask對象作為Thread對象啟動新線程。
  • 調用FutureTask對象的get()方法獲取子線程執行結束后的返回值。

四、繼承Thread類和實現Runnable接口、實現Callable接口的區別。

繼承Thread:線程代碼存放在Thread子類run方法中。

  • 優勢:編寫簡單,可直接用this.getname()獲取當前線程,不必使用Thread.currentThread()方法。
  • 劣勢:已經繼承了Thread類,無法再繼承其他類。

實現Runnable:線程代碼存放在接口的子類的run方法中。

  • 優勢:避免了單繼承的局限性、多個線程可以共享一個target對象,非常適合多線程處理同一份資源的情形。
  • 劣勢:比較復雜、訪問線程必須使用Thread.currentThread()方法、無返回值。

實現Callable

  • 優勢:有返回值、避免了單繼承的局限性、多個線程可以共享一個target對象,非常適合多線程處理同一份資源的情形。
  • 劣勢:比較復雜、訪問線程必須使用Thread.currentThread()方法建議使用實現接口的方式創建多線程。

五、線程狀態管理

1、線程睡眠---sleep:

線程睡眠的原因:線程執行的太快,或需要強制執行到下一個線程。

線程睡眠的方法(兩個):sleep(long millis)在指定的毫秒數內讓正在執行的線程休眠。

sleep(long millis,int nanos)在指定的毫秒數加指定的納秒數內讓正在執行的線程休眠。

線程睡眠的代碼演示:

public class SynTest {
    public static void main(String[] args) {
        new Thread(new CountDown(),"倒計時").start();
    }
}
class CountDown implements Runnable{
    int time = 10;
    public void run() {
        while (true) {
            if(time>=0){
                System.out.println(Thread.currentThread().getName() + ":" + time--);
                try {
                    Thread.sleep(1000);
                    //睡眠時間為1秒
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

每隔一秒則會打印一次,打印結果為:

倒計時:10
倒計時:9
倒計時:8
倒計時:7
倒計時:6
倒計時:5
倒計時:4
倒計時:3
倒計時:2
倒計時:1
倒計時:0

擴展
Java線程調度是Java多線程的核心,只有良好的調度,才能充分發揮系統的性能,提高程序的執行效率。但是不管程序員怎么編寫調度,只能最大限度的影響線程執行的次序,而不能做到精準控制。因為使用sleep方法之后,線程是進入阻塞狀態的,只有當睡眠的時間結束,才會重新進入到就緒狀態,而就緒狀態進入到運行狀態,是由系統控制的,我們不可能精準的去干涉它,所以如果調用Thread.sleep(1000)使得線程睡眠1秒,可能結果會大于1秒。

總結

同步的前提

  1. 必須要有兩個或者兩個以上的線程。
  2. 必須是多個線程使用同一個鎖。
  3. 必須保證同步中只能有一個線程在運行。
  4. 只能同步方法,不能同步變量和類。
  5. 不必同步類中所有方法,類可以擁有同步和非同步的方法。
  6. 如果一個線程在對象上獲得一個鎖,就沒有任何其他線程可以進入(該對象的)類中的任何一個同步方法。
  7. 線程睡眠時,它所持的任何鎖都不會釋放。
    • 好處:解決了多線程的安全問題。
    • 弊端:多個線程需要判斷,消耗資源,降低效率。

如何找問題

  1. 明確哪些代碼是多線程運行代碼。
  2. 明確共享數據。
  3. 明確多線程運行代碼中哪些語句是操作共享數據的。

寫在最后

Java面試問題——線程全面詳解總結

  • 第一:看完點贊,感謝您對作者的認可;
  • ...
  • 第二:隨手轉發,分享知識,讓更多人學習到;
  • ...
  • 第三:記得點關注,每天更新的!!!
  • ...
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石台县| 钟祥市| 泊头市| 比如县| 皮山县| 昭苏县| 新田县| 宜阳县| 娱乐| 胶南市| 革吉县| 枞阳县| 伽师县| 甘南县| 荆州市| 自贡市| 曲阳县| 宝山区| 龙口市| 灌阳县| 德江县| 贞丰县| 石渠县| 韩城市| 南江县| 巫山县| 揭西县| 上高县| 大丰市| 兴城市| 保德县| 古交市| 寿阳县| 东阳市| 禄丰县| 常熟市| 九江县| 中西区| 郁南县| 平顺县| 祁阳县|