java多线程实战指南_学习笔记《Java多线程编程实战指南》二
2.1線程屬性
屬性
屬性類型及用途
只讀屬性
注意事項
編號(id)
long型,標識不同線程
是
不適合用作唯一標識
名稱(name)
String型,區(qū)分不同線程
否
設置名稱有助于代碼調試和問題定位
線程類別(daemon)
boolean型,true為守護線程,false為用戶線程
否
在start方法之前設置,關鍵任務線程應設置成用戶線程
優(yōu)先級(priority)
int型,1-10的優(yōu)先級,默認值5
否
建議使用默認值
*用戶線程會阻止java虛擬機的正常停止,當所有用戶線程都運行結束,java虛擬機才能停止;守護線程不會影響java虛擬機的正常停止,例如用于監(jiān)視其他線程的運行情況。如果是強制終止java虛擬機進程,則所有線程都會停止。
2.2線程方法
方法
功能
備注
static Thread currentThread()
返回當前線程,即當前代碼的執(zhí)行線程
同一段代碼可能被不同線程執(zhí)行,所有當前線程可能是不同的
void run()
用于實現線程的任務處理邏輯
是由java虛擬機直接調用的,應用程序不應調用該方法
void start()
啟動相應線程
一個Thread實例的start方法只能被調用一次。多次調用會拋出異常
void join()
等待相應線程運行結束
若A線程中調用B線程的join方法,表示A線程停止直到B線程運行結束。
static void yield()
使當前線程主動放棄其對處理器的占用,可能導致當前線程被暫停
如果沒有其他線程運行,則調用該方法的線程繼續(xù)運行
static void sleep(long millis)
使當前線程休眠指定時間
可以制作計時器
2.3一些廢棄方法
方法
功能
stop
停止線程的運行
suspend
暫停線程的運行
resume
使被暫停的線程繼續(xù)運行
2.4常見的線程
1.main線程即main方法。
2.http請求,一個請求就是一個線程。
3.java虛擬機垃圾回收器通過垃圾回收線程實現。
4.JIT編譯器將字節(jié)碼編譯為機器碼,是通過java虛擬機創(chuàng)建的專門的線程執(zhí)行的。
2.5線程的層次關系
A線程中的代碼創(chuàng)建了B線程,則A線程是B線程的父線程,B為子線程。線程間的父子關系被稱為線程的層次關系。父線程和子線程之間的生命周期沒有必然聯系,比如父線程結束后,子線程可以繼續(xù)運行。
2.6線程的生命周期狀態(tài)
版本一:
Thread.getState()查看線程狀態(tài),包括以下幾種:
NEW:已創(chuàng)建而未啟動狀態(tài)。一個線程中只會出現一次。
RUNNABLE:可被線程調度器進行調度的狀態(tài)(READY)或者正在運行的狀態(tài)(RUNNING)。處于READY狀態(tài)的線程也稱作活躍線程。
BLOCKED:阻塞狀態(tài)。一個線程可能因為阻塞式I/O操作如文件讀寫或者因為申請不到鎖,阻塞解除即為RUNNABLE狀態(tài)。
WAITING:等待狀態(tài)。能夠使線程變更為WAITING狀態(tài)的方法包括:Object.wait()、Thread.join()和LockSupport.park(Object)。解除WAITING狀態(tài)的方法,Object.notify()/notifiAll() 和 LockSupport.unpark(Object)。
TIMED_WAITING:帶有時間限制的等待狀態(tài)。在沒有指定操作解除該狀態(tài)達到一定時間,自動轉化為RUNNABLE狀態(tài)。
TERMINATED:終止狀態(tài)。包括運行結束和發(fā)生異常時。
版本二:
新建(new Thread) 當創(chuàng)建Thread類的一個實例(對象)時,此線程進入新建狀態(tài)(未被啟動)。
例如:Thread? t1=new Thread();
就緒(runnable) 線程已經被啟動,正在等待被分配給CPU時間片,也就是說此時線程正在就緒隊列中排隊等候得到CPU資源。例如:t1.start();
運行(running) 線程獲得CPU資源正在執(zhí)行任務(run()方法),此時除非此線程自動放棄CPU資源或者有優(yōu)先級更高的線程進入,線程將一直運行到結束。
死亡(dead)
當線程執(zhí)行完畢或被其它線程殺死,線程就進入死亡狀態(tài),這時線程不可能再進入就緒狀態(tài)等待執(zhí)行。
自然終止:正常運行run()方法后終止
異常終止:調用stop()方法讓一個線程終止運行
堵塞(blocked)
由于某種原因導致正在運行的線程讓出CPU并暫停自己的執(zhí)行,即進入堵塞狀態(tài)。
正在睡眠:用sleep(long t) 方法可使線程進入睡眠方式。一個睡眠著的線程在指定的時間過去可進入就緒狀態(tài)。
正在等待:調用wait()方法。(調用motify()方法回到就緒狀態(tài))
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多線程編程的優(yōu)勢和風險
優(yōu)勢:1.提高系統的吞吐率,一個進程有多個并發(fā)的操作
2.提高響應性。多線程的請求對其他請求不會產生影響。
3.充分利用多核。
4.最小化對系統資源的浪費。多個線程共享其所在進程所申請的資源,想比多個進程編程節(jié)約資源。
5.簡化程序的結構。
風險:1.線程安全問題。多個線程共享數據的時候,如果沒有采取相應的并發(fā)訪問控制措施,可能會產生數據一致性問題、丟失更新等。
2.線程活性問題。死鎖問題,兩個線程互相等待對方先釋放鎖,一直處于BLOCKED狀態(tài)?;铈i問題,一直嘗試某個操作但就是沒有進展,一直處于RUNNING狀態(tài)。線程饑餓問題,永遠無法獲取處理器執(zhí)行的機會,一直處于READY狀態(tài)。
3.上下文切換問題。處理器從執(zhí)行一個線程轉向執(zhí)行另一個線程的時候,會進行上下文切換,增加系統的消耗,不利于系統的吞吐率。
4.可靠性。單進程多線程的方式可能因為進程終止,而所有線程終止。有時可以考慮多進程多線程的方式。
總結
以上是生活随笔為你收集整理的java多线程实战指南_学习笔记《Java多线程编程实战指南》二的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机财务管理期末考试题及答案,计算机财
- 下一篇: 51单片机按键控制数码管0~9_基于pr