Java基礎(chǔ)夯實之線程問題全面解析_第1頁
Java基礎(chǔ)夯實之線程問題全面解析_第2頁
Java基礎(chǔ)夯實之線程問題全面解析_第3頁
Java基礎(chǔ)夯實之線程問題全面解析_第4頁
Java基礎(chǔ)夯實之線程問題全面解析_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第Java基礎(chǔ)夯實之線程問題全面解析目錄1.線程是什么2.怎樣創(chuàng)建線程2.1繼承Thread類2.2實現(xiàn)Runnable接口2.3實現(xiàn)Callable接口2.4使用線程池創(chuàng)建3.線程的狀態(tài)4.線程常用方法

1.線程是什么

操作系統(tǒng)支持多個應用程序并發(fā)執(zhí)行,每個應用程序至少對應一個進程,彼此之間的操作和數(shù)據(jù)不受干擾,彼此通信一般采用管道通信、消息隊列、共享內(nèi)存等方式。當一個進程需要磁盤IO的時候,CPU就切換到另外的進程,提高了CPU利用率。

有了進程,為什么還要線程?因為進程的成本太高了。

啟動新的進程必須分配獨立的內(nèi)存空間,建立數(shù)據(jù)表維護它的代碼段、堆棧段和數(shù)據(jù)段,這是昂貴的多任務工作方式。線程可以看作輕量化的進程。線程之間使用相同的地址空間,切換線程的時間遠小于切換進程的時間。

進程是資源分配的最小單位,而線程是CPU調(diào)度的最小單位。每一個進程中至少有一個線程,同一進程的所有線程共享該進程的所有資源,多個線程可以完成多個不同的任務,也就是我們常說的并發(fā)多線程。

2.怎樣創(chuàng)建線程

創(chuàng)建線程常用的有四種方式,分別是:

繼承Thread類實現(xiàn)Runnable接口實現(xiàn)Callable接口使用線程池創(chuàng)建

分別看一下怎么具體怎么使用代碼創(chuàng)建的?

2.1繼承Thread類

publicclassThreadDemo{

publicstaticvoidmain(String[]args){

Threadthread=newMyThread();

thread.start();//啟動線程

classMyThreadextendsThread{

@Override

publicvoidrun(){

System.out.println("關(guān)注公眾號:一燈架構(gòu)");

輸出結(jié)果:

關(guān)注公眾號:一燈架構(gòu)

start方法用來啟動線程,只能被調(diào)用一次。

run方法是線程的核心方法,業(yè)務邏輯都寫在run方法中。

2.2實現(xiàn)Runnable接口

publicclassThreadDemo{

publicstaticvoidmain(String[]args){

MyRunnablemyRunnable=newMyRunnable();

Threadthread1=newThread(myRunnable,"線程1");

Threadthread2=newThread(myRunnable,"線程2");

thread1.start();//啟動線程1

thread2.start();//啟動線程2

classMyRunnableimplementsRunnable{

privateintcount=5;

@Override

publicvoidrun(){

while(count0){

System.out.println(Thread.currentThread().getName()

+",關(guān)注公眾號:一燈架構(gòu),"+count--);

輸出結(jié)果:

線程2,關(guān)注公眾號:一燈架構(gòu),4

線程1,關(guān)注公眾號:一燈架構(gòu),5

線程1,關(guān)注公眾號:一燈架構(gòu),2

線程1,關(guān)注公眾號:一燈架構(gòu),1

線程2,關(guān)注公眾號:一燈架構(gòu),3

需要把Runnable實例放到Thread類中,才能執(zhí)行,Thread對象才是真正的線程對象。

使用實現(xiàn)Runnable接口創(chuàng)建線程方式,相比繼承Thread類創(chuàng)建線程,優(yōu)點是:

實現(xiàn)的方式?jīng)]有類的單繼承性的局限性實現(xiàn)的方式更適合來處理多個線程有共享數(shù)據(jù)的情況

2.3實現(xiàn)Callable接口

publicclassThreadTest{

publicstaticvoidmain(String[]args)throwsExecutionException,InterruptedException{

MyCallablemyCallable=newMyCallable();

FutureTaskStringfutureTask=newFutureTaskString(myCallable);

Threadthread=newThread(futureTask);

thread.start();

System.out.println(futureTask.get());

classMyCallableimplementsCallable{

@Override

publicStringcall()throwsException{

return"關(guān)注公眾號:一燈架構(gòu)";

輸出結(jié)果:

關(guān)注公眾號:一燈架構(gòu)

實現(xiàn)Callable接口的線程實例對象,配合FutureTask使用,可以接收返回值。

2.4使用線程池創(chuàng)建

publicclassThreadDemo{

publicstaticvoidmain(String[]args){

ExecutorServiceexecutorService=Executors.newFixedThreadPool(10);

executorService.execute(()-System.out.println("關(guān)注公眾號:一燈架構(gòu)"));

輸出結(jié)果:

關(guān)注公眾號:一燈架構(gòu)

使用線程池創(chuàng)建線程是工作開發(fā)中最常用的方式,優(yōu)點是:

線程池幫忙管理對象的創(chuàng)建與銷毀,減輕開發(fā)者工作量線程池幫忙管理任務的調(diào)用,資源的創(chuàng)建與分配復用線程和對象,提高使用效率

3.線程的狀態(tài)

線程共有6種狀態(tài),分別是NEW(初始化)、RUNNABLE(可運行)、WAITING(等待)、TIMED_WAITING(超時等待)、BLOCKED(阻塞)、TERMINATED(終止)。

1.NEW(初始化)

表示創(chuàng)建線程對象之后,還沒有調(diào)用start方法。

2.RUNNABLE(可運行)

表示調(diào)用start方法之后,等待CPU調(diào)度。為了便于理解,通常又把RUNNABLE分別RUNNING(運行中)和READY(就緒)。處在RUNNING(運行中)狀態(tài)的線程可以調(diào)用yield方法,讓出CPU時間片,然后跟其他處于READY(就緒)一起等待被調(diào)度。

3.WAITING(等待)

處于RUNNABLE狀態(tài)的線程調(diào)用wait方法之后,就處于等待狀態(tài),需要其他線程顯示地喚醒。

4.TIMED_WAITING(超時等待)

處于RUNNABLE狀態(tài)的線程調(diào)用wait(long)方法之后,就處于等待狀態(tài),需要其他線程顯示地喚醒。

5.BLOCKED(阻塞)

等待進入synchronized方法/代碼塊,處于阻塞狀態(tài)。

6.TERMINATED(終止)

表示線程已經(jīng)執(zhí)行結(jié)束。

4.線程常用方法

說一下線程有哪些常用的方法。

方法定義含義使用方式publicsynchronizedvoidstart(){}啟動線程MyThreadmyThread=newMyThread();

myThread.start();publicstaticnativeThreadcurrentThread();獲取當前線程實例對象Threadthread=Thread.currentThread();publicstaticnativevoidyield();讓出CPU時間片Thread.yield();publicstaticnativevoidsleep(longmillis);睡眠指定時間Thread.sleep(1L);publicvoidinterrupt(){}中斷線程MyThreadmyThread=newMyThread();

myTerrupt();publicstaticbooleaninterrupted(){}判斷線程是否已中斷MyThreadmyThread=newMyThread();

booleaninterrupted=myThread.isInterrupted();publicfinalnativebooleanisAlive();判斷線程是否是存活狀態(tài)MyThreadmyThread=newMyThread();

booleanalive=myThread.isAlive();publicfinalStringgetName(){}獲取線程名稱MyThreadmyThread=newMyThread();

Stringname=myThread.getName();publicStategetState(){}獲取線程狀態(tài)MyThreadmyThread=newMyThread();

Thread.Statestate=myThread.getState();publiclonggetId(){}獲取線程IDMyT

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論