日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java多线程实战指南_学习笔记《Java多线程编程实战指南》二

發布時間:2023/12/10 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多线程实战指南_学习笔记《Java多线程编程实战指南》二 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2.1線程屬性

屬性

屬性類型及用途

只讀屬性

注意事項

編號(id)

long型,標識不同線程

不適合用作唯一標識

名稱(name)

String型,區分不同線程

設置名稱有助于代碼調試和問題定位

線程類別(daemon)

boolean型,true為守護線程,false為用戶線程

在start方法之前設置,關鍵任務線程應設置成用戶線程

優先級(priority)

int型,1-10的優先級,默認值5

建議使用默認值

*用戶線程會阻止java虛擬機的正常停止,當所有用戶線程都運行結束,java虛擬機才能停止;守護線程不會影響java虛擬機的正常停止,例如用于監視其他線程的運行情況。如果是強制終止java虛擬機進程,則所有線程都會停止。

2.2線程方法

方法

功能

備注

static Thread currentThread()

返回當前線程,即當前代碼的執行線程

同一段代碼可能被不同線程執行,所有當前線程可能是不同的

void run()

用于實現線程的任務處理邏輯

是由java虛擬機直接調用的,應用程序不應調用該方法

void start()

啟動相應線程

一個Thread實例的start方法只能被調用一次。多次調用會拋出異常

void join()

等待相應線程運行結束

若A線程中調用B線程的join方法,表示A線程停止直到B線程運行結束。

static void yield()

使當前線程主動放棄其對處理器的占用,可能導致當前線程被暫停

如果沒有其他線程運行,則調用該方法的線程繼續運行

static void sleep(long millis)

使當前線程休眠指定時間

可以制作計時器

2.3一些廢棄方法

方法

功能

stop

停止線程的運行

suspend

暫停線程的運行

resume

使被暫停的線程繼續運行

2.4常見的線程

1.main線程即main方法。

2.http請求,一個請求就是一個線程。

3.java虛擬機垃圾回收器通過垃圾回收線程實現。

4.JIT編譯器將字節碼編譯為機器碼,是通過java虛擬機創建的專門的線程執行的。

2.5線程的層次關系

A線程中的代碼創建了B線程,則A線程是B線程的父線程,B為子線程。線程間的父子關系被稱為線程的層次關系。父線程和子線程之間的生命周期沒有必然聯系,比如父線程結束后,子線程可以繼續運行。

2.6線程的生命周期狀態

版本一:

Thread.getState()查看線程狀態,包括以下幾種:

NEW:已創建而未啟動狀態。一個線程中只會出現一次。

RUNNABLE:可被線程調度器進行調度的狀態(READY)或者正在運行的狀態(RUNNING)。處于READY狀態的線程也稱作活躍線程。

BLOCKED:阻塞狀態。一個線程可能因為阻塞式I/O操作如文件讀寫或者因為申請不到鎖,阻塞解除即為RUNNABLE狀態。

WAITING:等待狀態。能夠使線程變更為WAITING狀態的方法包括:Object.wait()、Thread.join()和LockSupport.park(Object)。解除WAITING狀態的方法,Object.notify()/notifiAll() 和 LockSupport.unpark(Object)。

TIMED_WAITING:帶有時間限制的等待狀態。在沒有指定操作解除該狀態達到一定時間,自動轉化為RUNNABLE狀態。

TERMINATED:終止狀態。包括運行結束和發生異常時。

版本二:

新建(new Thread)  當創建Thread類的一個實例(對象)時,此線程進入新建狀態(未被啟動)。

例如:Thread? t1=new Thread();

就緒(runnable)  線程已經被啟動,正在等待被分配給CPU時間片,也就是說此時線程正在就緒隊列中排隊等候得到CPU資源。例如:t1.start();

運行(running)  線程獲得CPU資源正在執行任務(run()方法),此時除非此線程自動放棄CPU資源或者有優先級更高的線程進入,線程將一直運行到結束。

死亡(dead)

當線程執行完畢或被其它線程殺死,線程就進入死亡狀態,這時線程不可能再進入就緒狀態等待執行。

自然終止:正常運行run()方法后終止

異常終止:調用stop()方法讓一個線程終止運行

堵塞(blocked)

由于某種原因導致正在運行的線程讓出CPU并暫停自己的執行,即進入堵塞狀態。

正在睡眠:用sleep(long t) 方法可使線程進入睡眠方式。一個睡眠著的線程在指定的時間過去可進入就緒狀態。

正在等待:調用wait()方法。(調用motify()方法回到就緒狀態)

2.7簡單運用實例

1 public classDownloadFiles {2

3 public static voidmain(String[] args) {4

5 String[] urls = new String[3];6 urls[0] = "http://www.xinhuanet.com//world/2016-03/09/c_128786392.htm";7 urls[1] = "http://news.gmw.cn/2018-05/25/content_28959728.htm";8 urls[2] = "http://gz.people.com.cn/BIG5/200190/205622/206162/15876781.html";9

10 Thread downloadThread = null;11 for(String url :urls){12 downloadThread = new Thread(newFileDownloader(url));13 downloadThread.start();14 }15 }16

17 static class FileDownloader implementsRunnable{18

19 private finalString fileUrl;20

21 publicFileDownloader(String url) {22 this.fileUrl =url;23 }24

25 @Override26 public voidrun() {27 String fileName = fileUrl.substring(fileUrl.lastIndexOf('/')+1);28 try{29 URL url = newURL(fileUrl);30 String localFileName = System.getProperty("java.io.tmpdir")+"/viscent-"+fileName;31 downloadFiles(url,new FileOutputStream(localFileName),1024);32 } catch(Exception e) {33 e.printStackTrace();34 }35 }36

37 private void downloadFiles(URL url,OutputStream outputStream,intbufSize){38 try{39 HttpURLConnection urlConnection=null;40 //打開URL

41 urlConnection =(HttpURLConnection)url.openConnection();42 urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36)"); //防止報403錯誤。43 //獲取服務器響應代碼

44 int responsecode=urlConnection.getResponseCode();45 if(responsecode==200){46 BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"UTF-8"));47 String content = null;48 while((content = reader.readLine()) != null){49 outputStream.write(content.getBytes());50 }51 System.out.println("下載成功");52 reader.close();53 urlConnection.disconnect();54 }55 } catch(IOException e) {56 e.printStackTrace();57 }58 }59

60 }61

62 }

2.8多線程編程的優勢和風險

優勢:1.提高系統的吞吐率,一個進程有多個并發的操作

2.提高響應性。多線程的請求對其他請求不會產生影響。

3.充分利用多核。

4.最小化對系統資源的浪費。多個線程共享其所在進程所申請的資源,想比多個進程編程節約資源。

5.簡化程序的結構。

風險:1.線程安全問題。多個線程共享數據的時候,如果沒有采取相應的并發訪問控制措施,可能會產生數據一致性問題、丟失更新等。

2.線程活性問題。死鎖問題,兩個線程互相等待對方先釋放鎖,一直處于BLOCKED狀態。活鎖問題,一直嘗試某個操作但就是沒有進展,一直處于RUNNING狀態。線程饑餓問題,永遠無法獲取處理器執行的機會,一直處于READY狀態。

3.上下文切換問題。處理器從執行一個線程轉向執行另一個線程的時候,會進行上下文切換,增加系統的消耗,不利于系統的吞吐率。

4.可靠性。單進程多線程的方式可能因為進程終止,而所有線程終止。有時可以考慮多進程多線程的方式。

總結

以上是生活随笔為你收集整理的java多线程实战指南_学习笔记《Java多线程编程实战指南》二的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。