I學霸官方免費教程三十九 Java基礎教程之執行緒

2021-08-27 21:54:45 字數 3168 閱讀 3927

建立執行緒的兩種方式

1、實現runnable介面:還可以繼承其他類

2、繼承thread類:使用簡單

方式一:實現runnable介面

package thread;

/** * 建立myrunnable類,並實現runnable介面

* @author 學霸聯盟 - 趙燦

*/public class myrunnable implements runnable

}

方式二:

package thread;

/** * 建立mythread類,並繼承thread介面

* @author 學霸聯盟 - 趙燦

*/public class mythread extends thread

}

package thread;

/** * 建立測試類test,測試以上兩種方式建立的執行緒

* @author 學霸聯盟 - 趙燦

*/public class test

}輸出結果:

myrunnable-run

mythread-run

或mythread-run

myrunnable-run

由於多個執行緒是並行執行的,即同時執行。

就以上**而言,會先執行t.start();再執行mt.start();但是由於這裡的**非常簡單,在非常非常短的時間內,兩個現場就啟動完成了;而執行緒啟動後並不是立即執行的,要等待排程程式選擇哪個執行緒執行,所以此處啟動的兩個執行緒誰先執行並不能確定。所以輸出順序也不確定。

新建(初始態):執行new操作後。此時在已經在記憶體中建立出了執行緒物件,但執行緒還沒有啟動執行

可執行:呼叫start()方法後。此時執行緒已經啟動,但還沒有執行(執行緒的執行是通過cpu執行完成的),另一種說法是:還沒有獲得cpu的使用權;正在和其他可執行狀態的執行緒一起等待系統的排程程式選取,選中哪個執行緒,哪個現在使用cpu執行程式,執行一定的時間(cpu的時間片)後,退出對cpu的占用,轉入可執行狀態,和其他執行緒一起等待系統排程程式的選取。

執行:已獲得cpu的使用權,正在執行

阻塞:執行sleep(int)、yield()、join()、wait()方法後,阻塞狀態的執行緒不會被排程程式選中。只有從阻塞狀態恢復至可執行態以後,才有機會獲得cpu的使用權

static void sleep(int)靜態方法,建議使用類名thread呼叫;

作用:執行緒休眠;哪個執行緒執行thread.sleep();這條語句,哪個執行緒就會休眠(阻塞);int型別的引數,代表執行緒休眠的時間(毫秒),時間結束自動恢復至可執行態,和其他執行緒一起等待排程程式的選取

一句話:誰執行,誰休眠。

例項:

package thread.sleep;

/*** 建立sleepdemo類

* 用於測試sleep方法

* @author 學霸聯盟 - 趙燦

*/public class sleepdemo catch (interruptedexception e)

system.out.println("主線程休眠結束");

system.out.println("主線程恢復執行"); }}

輸出結果:

主線程正在執行

主線程休眠開始【這裡會休眠(停止)1秒,1秒後繼續輸出以下內容】

主線程休眠結束

主線程恢復執行

static void yield()靜態方法,建議使用類名thread呼叫。

作用:執行緒讓步;哪個執行緒執行thread.yield();語句,哪個執行緒就會把已經獲得的cpu使用權讓出來,並進入可執行狀態,和其他執行緒一起等待排程程式的選取;

一句話:誰執行,誰讓步。

例項:

package thread.yield;

/** * 建立yielddemo類

* 用於測試執行緒的讓步執行

* @author 學霸聯盟 - 趙燦

*/public class yielddemo

}/**

* 建立threada類,並繼承thread類

* @author 學霸聯盟 - 趙燦

*/class threada extends thread }}

/** * 建立threadb類,並繼承thread類

* @author 學霸聯盟 - 趙燦

*/class threadb extends thread }}

輸出結果:輸出順序是不確定的;多數情況下,執行緒tb會先執行完,執行緒ta後執行完,而且執行緒tb的執行頻率要比執行緒ta高,但不是絕對的

void join([int] [,int]);非靜態方法,只能使用物件呼叫。

作用:執行緒插隊;假設現在有執行緒a和b,執行緒a中執行了b.join();語句,執行緒b會插隊到執行緒a前執行,執行緒a會被阻塞

一句話:誰呼叫,誰插隊;誰執行,誰阻塞。

其中可以傳入乙個int型別的引數,代表插隊的毫秒數,如果傳入兩個int型別的引數,代表插隊的毫秒數(左)和納秒數(右);插隊時間結束後,插隊執行緒和被阻塞執行緒都回到可執行狀態,等待排程程式的選取

例項:

package thread.join;

/** * 建立joindemo類

* 用於測試執行緒的讓步執行

* @author 學霸聯盟 - 趙燦

*/public class joindemo

}/**

* 建立threada類,並繼承thread類

* @author 學霸聯盟 - 趙燦

*/class threada extends thread catch (interruptedexception e)

}//輸出乙個字串,為了在結果中可以看到執行緒ta的執行頻率

system.out.println("threada-" + i);

} }}/**

* 建立threadb類,並繼承thread類

* @author 學霸聯盟 - 趙燦

*/class threadb extends thread }}

由於輸出結果的順序完全不確定,這裡同學們一定要自行測試

I學霸官方免費教程三十八 Java基礎教程之異常

程式中不正常的情況分為兩大類 錯誤 error 和異常 exception 錯誤 error 程式本身無法對這種不正常的情況進行處理,將會導致程式崩潰 例如 記憶體耗盡錯誤,jvm崩潰錯誤等 異常 exception 程式可以特殊的 對不正常的情況進行捕獲和處理,程式可以繼續執行 例如 除零異常,空...

I學霸官方免費教程十二 Java基礎之內部類

在乙個類的內部或方法的內部宣告的類,叫做內部類。語法格式 訪問修飾符 static class 類名 可以簡單的把內部類理解成乙個變數,只不過這個變數的資料型別是class,使用時需要建立物件後再使用。成員內部類 直接宣告在類中的內部類 同成員變數 區域性內部類 生命在方法中的內部類 同區域性變數 ...

I學霸官方免費教程一 Java軟體開發預備知識

主機 主機箱 主機板 記憶體 硬碟 cpu 處理器 音效卡 顯示卡 網絡卡 外設 顯示器 音響 輸入裝置 鍵盤 滑鼠 掃瞄器 輸出裝置 顯示器 投影儀 音響 系統軟體 windows linux ios unix android 編譯軟體 程式語言,編譯器,直譯器 軟體 按照特定順序組織的計算機資料...