當前位置:
首頁 > 知識 > Java總結之線程(1)

Java總結之線程(1)

java線程是很重要的一項,所以作為java程序員必須要掌握的。

理解java線程必須先理解線程在java中的生命周期。、

Java總結之線程(1)

1.java線程生命周期

1.new 創建一個線程 java中創建線程有三種方式,1.繼承Thread類,2.繼承Runnable介面,然後重寫父類的run方法。

2.Runnable 線程處於就緒狀態,隨時可以被cpu調用。

3.Running 線程處於運行狀態,此時線程正在CPU中執行。

4.Blocked 線程處於阻塞狀態,由於某種原因,cpu暫時中斷線程的資源。只有線程再次進入就緒狀態才能重新被cpu調用,同時阻塞有三種狀態

(1)等待阻塞:運行狀態中的線程執行wait方法,使本線程進入等待阻塞狀態。

(2)同步阻塞:線程在獲取synchronized同步鎖失敗(因為鎖被其它線程所佔用),它會進入同步阻塞狀態;

(3)其他阻塞:通過調用線程的sleep或join或發出了I/O請求時,線程會進入到阻塞狀態。當sleep狀態超時、join等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。

(4)死亡狀態:線程運行完畢或因異常終止線程,該線程結束生命周期。

2.線程的三種創建方式

(1) 繼承Thread類

public class MyThread extends Thread{

public MyThread(String name){
super(name);
}

@Override
public void run {
for(int i=0;i<100;i++) System.out.println(Thread.currentThread.getName+" "+i); } }

(2)繼承Runnable介面

public class MyRunnable implements Runnable{

private boolean stop=false;

@Override
public void run {
for(int i=0;i<100&&!stop;i++){ System.out.println(Thread.currentThread.getName+" "+i); } } public void stopThread{ this.stop=true; } }

二者的區別在於Thread繼承Runnable類,然後再繼承Thread類從而調用線程,而Runnable類是一個介面,通過直接繼承Runnable類來實現。

同時二者在創建時還有區別

測試 Thread:

public void testThread {
for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread.getName + " " + i); if (i == 30) { MyThread myThread1 = new MyThread("窗口1"); MyThread myThread2 = new MyThread("窗口2"); MyThread myThread3 = new MyThread("窗口3"); MyThread myThread4 = new MyThread("窗口4"); myThread1.start; myThread2.start; myThread3.start; myThread4.start; } } }

測試Runnable方式:

public void testRunnable {
int i = 0;
for (i = 0; i <= 100; i++) { System.out.println(Thread.currentThread.getName + " " + i); if (i == 30) { Runnable myRunnable = new MyRunnable; Thread thread1 = new Thread(myRunnable); Thread thread2 = new Thread(myRunnable); thread1.start; thread2.start; } } }

可以看出來在繼承Thread類後通過new 一個繼承了Thread的MyThread類來實現線程的創建,然後通過調用Thread方法中的start方法使線程處於就緒狀態。

而繼承了Runnable方法的類new一個MyRunnable 然後在將myRunnable放入new的一個Thread中,然後在通過start方法使線程處於就緒狀態。

3.繼承Callable類

public class MyCallable implements Callable {

private int i=0;
@Override
public Integer call throws Exception {
int sum=0;
for(;i<100;i++){ System.out.println(Thread.currentThread.getName+" "+i); sum+=i; } return sum; } }

測試:

public void testCallable {
Callable myCallable = new MyCallable;
FutureTask ft = new FutureTask<>(myCallable);
for (int i = 0; i <= 100; i++) { System.out.println(Thread.currentThread.getName + " " + i); if (i == 30) { Thread thread = new Thread(ft); thread.start; } } System.out.println("主線程執行完畢"); try { int sum = ft.get; System.out.println("sum= " + sum); } catch (Exception e) { e.printStackTrace; } }

通過測試你會發現繼承了Callable類之後會通過FutureTask類進行包裝,然後再在Thread中調用,查api你會看到FutureTask類既繼承了Future類又繼承了Runnabl類,同時Callabl類與另外兩個的區別在於call方法有返回參數。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

如何使用Node.js編寫命令工具——以vue-cli為例
限制input「type=number」的輸入位數策略整理
ASP.NET MVC 重寫RazorViewEngine實現多主題切換
我的面試準備過程——JVM相關
運維腳本:文件的空間使用和IO統計

TAG:科技優家 |

您可能感興趣

Mariadb學習總結(七):單表查詢
Mariadb學習總結(三):數據類型
優美的信息圖:吳恩達點贊的deeplearning.ai課程總結
AWS re:Invent 2017大會回顧總結
Mariadb學習總結(八):聚合函數及分組查詢
JMeter測試WebSocket的經驗總結
持守Ashtanga318天的總結
我的Chromebook日記第四篇之總結
Web Services總結
看完三星Note 9,網友總結:Note 8 renew
Mariadb學習總結(四):數據的插入刪除與修改
LCK:SKT春季賽半程總結 faker表示打出80%的實力
Mariadb學習總結(二):資料庫及表管理
VBScript 總結
E3 任天堂展區體驗總結:Everyone Play Together
IMDb 總結《Avengers : Endgame》主要角色的上場時間
總結:iview(基於vue.js的開源ui組件)學習的一些坑
Pixel Watch預測總結Google狙擊 pple Watch的秘密武器
Anitama的2018年終總結
介面測試總結分享(http與rpc)