真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java面試問題——線程全面詳解總結(jié)

Java面試問題——線程全面詳解總結(jié)

成都創(chuàng)新互聯(lián)為企業(yè)級客戶提高一站式互聯(lián)網(wǎng)+設(shè)計服務(wù),主要包括成都做網(wǎng)站、成都網(wǎng)站設(shè)計、成都外貿(mào)網(wǎng)站建設(shè)手機(jī)APP定制開發(fā)、微信小程序、宣傳片制作、LOGO設(shè)計等,幫助客戶快速提升營銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗豐富的經(jīng)驗,可以確保每一個作品的質(zhì)量和創(chuàng)作周期,同時每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。 

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

介紹多線程之前要介紹線程,介紹線程則離不開進(jìn)程。

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

線程:就是進(jìn)程中的一個獨立控制單元,線程在控制著進(jìn)程的執(zhí)行。一個進(jìn)程中至少有一個進(jìn)程。

多線程:一個進(jìn)程中不只有一個線程。

為什么要用多線程

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

二、線程的生命周期:

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

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

運行:就緒狀態(tài)下的線程在獲取CPU資源后就可以執(zhí)行run(),此時的線程便處于運行狀態(tài),運行狀態(tài)的線程可變?yōu)榫途w、阻塞及死亡三種狀態(tài)。

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

終止:run()方法完成后或發(fā)生其他終止條件時就會切換到終止?fàn)顟B(tài)。

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

1、繼承Thread類:

步驟: 、定義類繼承Thread;

  • 復(fù)寫Thread類中的run方法;

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

  • 調(diào)用線程的start方法:

該方法有兩步:啟動線程,調(diào)用run方法。

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

實現(xiàn)步驟: 、定義類實現(xiàn)Runnable接口

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

3、通過Callable和Future創(chuàng)建線程:

實現(xiàn)步驟

  • 創(chuàng)建Callable接口的實現(xiàn)類,并實現(xiàn)call()方法,改方法將作為線程執(zhí)行體,且具有返回值。
  • 創(chuàng)建Callable實現(xiàn)類的實例,使用FutrueTask類進(jìn)行包裝Callable對象,F(xiàn)utureTask對象封裝了Callable對象的call()方法的返回值
  • 使用FutureTask對象作為Thread對象啟動新線程。
  • 調(diào)用FutureTask對象的get()方法獲取子線程執(zhí)行結(jié)束后的返回值。

四、繼承Thread類和實現(xiàn)Runnable接口、實現(xiàn)Callable接口的區(qū)別。

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

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

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

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

實現(xiàn)Callable

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

五、線程狀態(tài)管理

1、線程睡眠---sleep:

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

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

sleep(long millis,int nanos)在指定的毫秒數(shù)加指定的納秒數(shù)內(nèi)讓正在執(zhí)行的線程休眠。

線程睡眠的代碼演示:

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();
                }
            }
        }
    }
}

每隔一秒則會打印一次,打印結(jié)果為:

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

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

總結(jié)

同步的前提

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

如何找問題

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

寫在最后

Java面試問題——線程全面詳解總結(jié)

  • 第一:看完點贊,感謝您對作者的認(rèn)可;
  • ...
  • 第二:隨手轉(zhuǎn)發(fā),分享知識,讓更多人學(xué)習(xí)到;
  • ...
  • 第三:記得點關(guān)注,每天更新的?。?!
  • ...

網(wǎng)頁題目:Java面試問題——線程全面詳解總結(jié)
鏈接URL:http://weahome.cn/article/pcjcoe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部