最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java基礎(chǔ):徹底搞懂java多線程

 更新時間:2021年08月26日 10:36:28   作者:xufei5789651  
篇文章主要介紹了Java多線程的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java線程相關(guān)知識,感興趣的朋友可以了解下,希望能給你帶來幫助

進(jìn)程與線程

進(jìn)程

進(jìn)程是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ),是程序在一個數(shù)據(jù)集合上運(yùn)行的過程,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位。進(jìn)程可以被看作程序的實體,同樣,它也是程序的容器。

線程

線程是操作系統(tǒng)調(diào)度的最小單元,也叫作輕量級進(jìn)程。在一個進(jìn)程中可以創(chuàng)建多個線程,這些線程都擁有各自的計數(shù)器、堆棧和局部變量等屬性。

使用多線程的優(yōu)勢

  • 使用多線程可以減少程序的響應(yīng)時間

如果某個操作很耗時,或者陷入長時間的等待,此時程序?qū)⒉粫憫?yīng)鼠標(biāo)和鍵盤等的操作,使用多線程后可以把這個耗時的操作分配到一個單獨的線程中執(zhí)行,從而使程序具備了更好的交互性。

  • 與進(jìn)程相對,線程創(chuàng)建和切換開銷更小,同時多線程在數(shù)據(jù)共享方面效率非常高。
  • 多CPU 或者多核計算機(jī)本身就具備執(zhí)行多線程的能力。

如果使用單個線程,將無法重復(fù)利用計算機(jī)資源,這會造成資源的巨大浪費(fèi)。在多CPU計算機(jī)中使用多線程能提高CPU的利用率。

  • 使用多線程能簡化程序的結(jié)構(gòu),使程序便于理解和維護(hù)。

線程的狀態(tài)

  • New

新創(chuàng)建狀態(tài)。線程被創(chuàng)建,還沒有調(diào)用start方法,在線程運(yùn)行之前還有一些基礎(chǔ)工作要做。

  • Runnable

可運(yùn)行狀態(tài)。一旦調(diào)用start方法,線程就處于Runnable 狀態(tài)。一個可運(yùn)行的線程可能正在運(yùn)行也可能沒有運(yùn)行,這取決于操作系統(tǒng)給線程提供運(yùn)行的時間。

  • Blocked

阻塞狀態(tài)。表示線程被鎖阻塞,它暫時不活動。

  • Waiting

等待狀態(tài)。線程暫時不活動,并且不運(yùn)行任何代碼,這消耗最少資源,直到線程調(diào)度器重新激活它。

  • Timed waiting

超時等待狀態(tài)。和等待不同的是,它是可以在指定的時間自行返回的。

  • Terminated

終止?fàn)顟B(tài)。表示當(dāng)前線程已經(jīng)執(zhí)行完畢。導(dǎo)致線程終止有兩種情況:(1)run方法執(zhí)行完畢正常退出;(2)因為一個沒有捕獲取得異常而終止了run 方法,導(dǎo)致線程進(jìn)入終止?fàn)顟B(tài)。

在這里插入圖片描述

線程創(chuàng)建后,調(diào)用Thead的start方法,開始進(jìn)入運(yùn)行狀態(tài),當(dāng)線程執(zhí)行wait方法后,線程進(jìn)入等待狀態(tài),進(jìn)入等待狀態(tài)的線程需要其他線程通知才能返回運(yùn)行狀態(tài)。超時等待相當(dāng)于在等待狀態(tài)加上了時間限制,如果超過時間限制,則線程返回運(yùn)行狀態(tài)。當(dāng)線程調(diào)用到同步方法時,如果線程沒有獲得鎖則進(jìn)入阻塞狀態(tài),當(dāng)阻塞狀態(tài)的線程獲取到鎖時則重新回到運(yùn)行狀態(tài)。當(dāng)線程執(zhí)行完畢或者遇到意外異常終止時,都會進(jìn)入終止?fàn)顟B(tài)。

創(chuàng)建線程

  • 繼承Thread類,重寫run()方法
    public class ThreadExample2 extends Thread{
    	public static void main(String[] args) {
    		Thread mThread=new ThreadExample2();
    		mThread.start();
    	}
    	@Override
    	public void run() {
    		 System.out.print("thread excute");		
    	}
    }
    
  • 實現(xiàn)Runnable接口,并實現(xiàn)該接口的Run()方法 (推薦)
    public class ThreadExample {
    	public static void main(String[] args) {
          ExRunnable runnable=new ExRunnable();
          Thread mThread=new Thread(runnable);
    	  mThread.start();
    	}
    }
    public class ExRunnable implements Runnable{
    	@Override
    	public void run() {
            System.out.print("thread excute");		
    	}
    }
    
  • 實現(xiàn)Callable接口,重寫call()方法

Callable接口是屬于Executor框架中的功能類。Callable可以在任務(wù)接受后提供一個返回值,Runnable無法提供這個功能。

  • Callable中的call()方法可以拋出異常,而Runnable的run()方法不能拋出異常。
  • 運(yùn)行Callable可以拿到一個Future對象,F(xiàn)uture對象表示異步計算的結(jié)果,它提供了檢查計算是否完成的方法。
  • 由于線程屬于異步計算模型,因此無法從別的線程中得到函數(shù)的返回值,在這種情況下就可以使用Future來監(jiān)視目標(biāo)線程調(diào)用call()方法的情況。但調(diào)用Future的get()方法以獲取結(jié)果時,當(dāng)前線程就會阻塞,直到call()方法返回結(jié)果。
public class ThreadExample {
	public static void main(String[] args) {
	  ExCallable mCallable=new ExCallable();
	  ExecutorService mExecutorService=Executors.newSingleThreadExecutor();
	  Future<String> mFuture=mExecutorService.submit(mCallable);
	  try {
		System.out.println(mFuture.get());
	  } catch (Exception e) {
		e.printStackTrace();
	  }
	}
}
public class ExCallable implements Callable<String> {
	@Override
	public String call() throws Exception {
		// TODO Auto-generated method stub
		return "thread excute";
	}
}

線程中斷

當(dāng)線程的run 方法執(zhí)行完畢,或者在方法中出現(xiàn)沒有捕獲的異常時,線程將終止。interrupt方法可以用來請求中斷線程。當(dāng)一個線程調(diào)用interrupt方法時,線程的中斷標(biāo)識位為true,線程會不時地檢測這個中斷標(biāo)識位,以判斷線程是否應(yīng)該被中斷。

// 判斷線程是否被中斷
Thread.currentThread().isInterrupted();

拋出InterruptedException 異常后,兩種處理方法:

void task(){
     ....
     try{
        sleep(50)
     }catch(InterruptedException e){
        Thread.currentThread().interrupted(); 
     }
 }

在catch子句中,調(diào)用Thread.currentThread().interrupted()來設(shè)置中斷狀態(tài)(因為拋出異常后中斷標(biāo)識位會復(fù)位,即重新設(shè)置為false),讓外界通過Thread.currentThread().isInterrupted() 來決定是否終止還是繼續(xù)下去。

void task() throw InterrupetedException{
     sleep(50); 
  }

不用try來捕獲異常,讓方法直接拋出,這樣調(diào)用者可以捕獲這個異常。

中斷線程Example

public class StopExampleThread {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			InterruptedRunnable mRunnable=new InterruptedRunnable();
			Thread thread=new Thread(mRunnable,"threadDemo");
			thread.start();
			TimeUnit.MILLISECONDS.sleep(10);
			thread.interrupt();
		} catch (InterruptedException e) {
			// 拋出InterruptedException后中斷標(biāo)志被清除
			// 再次調(diào)用interrupt恢復(fù)中斷
			Thread.currentThread().interrupt();
		}
	}
	static class InterruptedRunnable implements Runnable{
		int i=0;
		@Override
		public void run() {
			// TODO Auto-generated method stub
			while(!Thread.currentThread().isInterrupted()) {
				i++;
				System.out.println("i="+i);
			}
			System.out.println("stop");			
		}
	}

總結(jié)

  • 如果一個線程處于阻塞狀態(tài),線程在檢查中斷標(biāo)識位時,如果發(fā)現(xiàn)中斷標(biāo)識位為true,則會在阻塞方法調(diào)用處拋出InterruptedException 異常,并且在拋出異常前將線程的中斷標(biāo)識位復(fù)位,即重新設(shè)置為false。
  • 被中斷的線程不一定會終止,中斷線程是為了引起線程的注意,被中斷的線程可以決定如何去響應(yīng)中斷。如果是比較重要的線程則不會理會中斷,而大部分情況則是線程會將中斷作為一個終止的請求。

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • SpringBoot API增加version版本號方式

    SpringBoot API增加version版本號方式

    這篇文章主要介紹了SpringBoot API增加version版本號方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java Mail郵件接收工具類

    java Mail郵件接收工具類

    這篇文章主要介紹了java Mail郵件接收工具類,本文直接給出類實現(xiàn)代碼和使用示例,需要的朋友可以參考下
    2015-02-02
  • SpringBoot項目Pom文件的基本配置方式

    SpringBoot項目Pom文件的基本配置方式

    這篇文章主要介紹了SpringBoot項目Pom文件的基本配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java微信公眾平臺開發(fā)(9) 關(guān)鍵字回復(fù)以及客服接口實現(xiàn)

    Java微信公眾平臺開發(fā)(9) 關(guān)鍵字回復(fù)以及客服接口實現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺開發(fā)第九步,關(guān)鍵字回復(fù)以及客服接口實現(xiàn),以及遇到該公眾號暫時無法提供服務(wù)的解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java簡易登錄注冊小程序

    Java簡易登錄注冊小程序

    這篇文章主要為大家詳細(xì)介紹了Java圖形界面開發(fā),簡易登錄注冊小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java如何處理json字符串value多余雙引號

    Java如何處理json字符串value多余雙引號

    這篇文章主要介紹了Java如何處理json字符串value多余雙引號,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Java多線程之死鎖的出現(xiàn)和解決方法

    Java多線程之死鎖的出現(xiàn)和解決方法

    本篇文章主要介紹了Java多線程之死鎖的出現(xiàn)和解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 詳解Springboot集成sentinel實現(xiàn)接口限流入門

    詳解Springboot集成sentinel實現(xiàn)接口限流入門

    這篇文章主要介紹了詳解Springboot集成sentinel實現(xiàn)接口限流入門,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java生成二維碼的實現(xiàn)方式匯總

    Java生成二維碼的實現(xiàn)方式匯總

    本文將基于Spring Boot介紹兩種生成二維碼的實現(xiàn)方式,一種是基于Google開發(fā)工具包,另一種是基于Hutool來實現(xiàn),下面我們將基于Spring Boot,并采用兩種方式實現(xiàn)二維碼的生成,對于每一種方式還提供兩種類型的二維碼返回形式,需要的朋友可以參考下
    2023-09-09
  • 關(guān)于IDEA關(guān)聯(lián)數(shù)據(jù)庫的問題

    關(guān)于IDEA關(guān)聯(lián)數(shù)據(jù)庫的問題

    這篇文章主要介紹了IDEA關(guān)聯(lián)數(shù)據(jù)庫的相關(guān)知識,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論

绥宁县| 璧山县| 溧阳市| 辽阳市| 承德县| 灵宝市| 维西| 乳源| 东山县| 托克托县| 鹤峰县| 珠海市| 黑龙江省| 永吉县| 青川县| 天津市| 什邡市| 德州市| 中超| 增城市| 丰顺县| 保德县| 类乌齐县| 嘉黎县| 合川市| 崇礼县| 岢岚县| 永德县| 宕昌县| 鱼台县| 旬阳县| 会同县| 连州市| 儋州市| 凌云县| 嘉鱼县| 商都县| 海安县| 应用必备| 海原县| 满洲里市|