日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

淺析 Java多線程

瀏覽:91日期:2022-08-23 17:41:44

什么是進程

當一個程序進入內存中運行起來它就變為一個進程。因此,進程就是一個處于運行狀態的程序。同時進程具有獨立功能,進程是操作系統進行資源分配和調度的獨立單位。

什么是線程

線程是進程的組成部分。通常情況下,一個進程可擁有多個線程,而一個線程只能擁有一個父進程。

線程可以擁有自己的堆棧、自己的程序計數器及自己的局部變量,但是線程不能擁有系統資源,它與其父進程的其他線程共享進程中的全部資源,這其中包括進程的代碼段、數據段、堆空間以及一些進程級的資源(例如,打開的文件等)。

線程是進程的執行單元,是CPU調度和分派的基本單位,當進程被初始化之后,主線程就會被創建。同時如果有需要,還可以在程序執行過程中創建出其他線程,這些線程之間也是相互獨立的,并且在同一進程中并發執行。因此一個進程中可以包含多個線程,但是至少要包含一個線程,即主線程。

淺析 Java多線程

Java中的線程

Java 中使用Thread類表示一個線程。所有的線程對象都必須是Thread或其子類的對象。Thread 類中的 run 方法是該線程的執行代碼。讓我們來看一個實例:

public class Ticket extends Thread{ // 重寫run方法 public void run() { for (int i = 0; i < 20; i++) { System.out.println(getName() + ': ' + i); } }}

public class TestThread { public static void main(String[] args) { // 1.創建線程 Thread thread1 = new Ticket(); Thread thread2 = new Ticket();// 2.啟動線程 thread1.start(); thread2.start(); }}

運行結果如下:

淺析 Java多線程

 通過上面的代碼和運行結果,我們可以得到:

線程運行的幾個特點

1.同一進程下不同線程的調度不由程序控制。線程的執行是搶占式的,運行的順序和線程的啟動順序是無關的,當前運行的線程隨時都可能被掛起,然后其他進程搶占運行。

2.線程獨享自己的堆棧程序計數器和局部變量。兩個進程的局部變量互不干擾,各自的執行順序也是互不干擾。

3.兩個線程并發執行。兩個線程同時向前推進,并沒有說執行完一個后再執行另一個。

start()方法和run()方法

啟動一個線程必須調用Thread 類的 start()方法,使該線程處于就緒狀態,這樣該線程就可以被處理器調度。

run()方法是一個線程所關聯的執行代碼,無論是派生自 Thread類的線程類,還是實現Runnable接口的類,都必須實現run()方法,run()方法里是我們需要線程所執行的代碼。

實現多線程必須調用Thread 類的 start()方法來啟動線程,使線程處于就緒狀態隨時供CPU調度。如果直接調用run()方法的話,只是調用了Thread類的一個普通方法,會立即執行該方法中的代碼,并沒有實現多線程技術。

Java中多線程的實現方法

在Java中有三種方法實現多線程。

第一種方法:使用Thread類或者使用一個派生自Thread 類的類構建一個線程。

第二種方法:實現Runnable 接口來構建一個線程。(推薦使用)

第三種方法:實現Callable 接口來構建一個線程。(有返回值)

第一種方法

使用Thread類或者使用一個派生自Thread 類的類構建一個線程。

public class Ticket extends Thread{ // 重寫run方法 public void run() { for (int i = 0; i < 20; i++) { System.out.println(getName() + ': ' + i); } }}

public class TestThread { public static void main(String[] args) { // 1.創建線程 Thread thread1 = new Ticket(); Thread thread2 = new Ticket();// 2.啟動線程 thread1.start(); thread2.start(); }}

看上面的代碼,我們創建了一個Ticket類,它繼承了Thread類,重寫了Thread類的run方法。然后我們用Ticket類創建了兩個線程,并且啟動了它們。但我們不推薦使用這種方法,因為一個類繼承了Thread類,那它就沒有辦法繼承其他類了,這對較為復雜的程序開發是不利的。

第二種方法

實現Runnable 接口來構建一個線程。

public class Ticket implements Runnable{ // 重寫run方法 public void run() { for (int i = 0; i < 20; i++) { System.out.println(Thread.currentThread().getName() + ': ' + i); } }}

public class TestThread { public static void main(String[] args) { // 1.創建線程 Ticket t1 = new Ticket(); Ticket t2 = new Ticket(); Thread thread1 = new Thread(t1, '買票1號'); Thread thread2 = new Thread(t2, '買票2號');// 2.啟動線程 thread1.start(); thread2.start(); }}

我們創建了一個Ticket類,實現了Runnable接口,在該類中實現了run方法。在啟動線程前,我們要創建一個線程對象,不同的是我們要將一個實現了Runnable接口的類的對象作為Thread類構造方法的參數傳入,以構建線程對象。構造方法Thread的第二個參數用來指定該線程的名字,通過Thread.currentThread().getName()可獲取當前線程的名字。

在真實的項目開發中,推薦使用實現Runnable接口的方法進行多線程編程。因為這樣既可以實現一個線程的功能,又可以更好地復用其他類的屬性和方法。

第三種方法

實現Callable 接口來構建一個線程。

public class TestThread { public static void main(String[] args) { // 1.創建Callable的實例 Callable<String> callable = new Callable<String>() { @Override public String call() throws Exception {Thread.sleep(7000);return '我結束了'; } };// 2.通過FutureTask接口的實例包裝Callable的實例 FutureTask<String> futureTask = new FutureTask<String>(callable);// 3.創建線程并啟動 new Thread(futureTask).start();// 4.獲得結果并打印 try { System.out.println(futureTask.get()); } catch (Exception e) { e.printStackTrace(); } }}

首先我們用匿名內部類創建了一個實現Callable接口的類的對象,然后通過FutureTask 的實例包裝了Callable的實例,這樣我們就可以通過一個Thread 對象在新線程中執行call()方法,同時又可以通過get方法獲取到call()的返回值。然后創建線程并啟動它,最后在線程執行完執行完call()方法后得到返回值并打印。

我們來看一下Callable的源碼:

public interface Callable<V> { /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute a result */ V call() throws Exception;}

從Callable 的定義可以看出,Callable接口是一個泛型接口,它定義的call()方法類似于Runnable 的run()方法,是線程所關聯的執行代碼。但是與run()方法不同的是,call()方法具有返回值,并且泛型接口的參數V指定了call()方法的返回值類型。同時,如果call()方法得不到返回值將會拋出一個異常,而在Runnable的run()方法中不能拋出異常。

如何獲得call()方法的返回值

通過Future接口來獲取。Future接口定義了一組對 Runnable 或者Callable 任務的執行結果進行取消、查詢、獲取、設置的操作。其中get方法用于獲取call()的返回值,它會發生阻塞,直到call()返回結果。

這樣的線程調用與直接同步調用函數有什么差異

在上面的例子中,通過future.get()獲取 call()的返回值時,由于call方法中會 sleep 7s,所以在執行future.get()的時候主線程會被阻塞而什么都不做,等待call()執行完并得到返回值。但是這與直接調用函數獲取返回值還是有本質區別的。

因為call()方法是運行在其他線程里的,在這個過程中主線程并沒有被阻塞,還是可以做其他事情的,除非執行future.get()去獲取 call()的返回值時主線程才會被阻塞。所以當調用了Thread.start()方法啟動 Callable 線程后主線程可以執行別的工作,當需要call()的返回值時再去調用future.get()獲取,此時call()方法可能早已執行完畢,這樣就可以既確保耗時操作在工作線程中完成而不阻擋主線程,又可以得到線程執行結果的返回值。而直接調用函數獲取返回值是一個同步操作,該函數本身就是運行在主線程中,所以一旦函數中有耗時操作,必然會阻擋主線程。

以上就是淺析 Java多線程的詳細內容,更多關于Java多線程的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩中文字幕| 美女黄网久久| 国产精品第一国产精品| 国产乱人伦丫前精品视频| 日韩欧美三区| 亚洲日产av中文字幕| 日韩一区精品| 国产伦精品一区二区三区在线播放 | 麻豆久久一区| 久久精品女人| 欧洲精品一区二区三区| 99成人超碰| 日韩视频二区| 综合激情视频| 日韩三级精品| 久久99影视| 成人羞羞视频播放网站| 在线一区免费观看| 日本欧美在线| 精品九九久久| 亚洲午夜黄色| 日本中文字幕一区二区视频 | 欧美激情综合| 国产精品精品| 国产精品av久久久久久麻豆网| 日韩午夜精品| 欧美日韩一区二区三区不卡视频 | 日韩av福利| 欧美精品激情| 91大神在线观看线路一区| 麻豆91精品91久久久的内涵| 久久精品在线| 日本亚洲不卡| 成人国产精品| 日韩中文字幕一区二区三区| 国产精品中文| 国内激情久久| 青草久久视频| 日韩欧美一区二区三区免费看| 亚洲免费中文| 久久尤物视频| 国产精品毛片| 久久久91麻豆精品国产一区| 欧美日韩国产在线观看网站| 日韩av三区| 久久久久国产精品一区二区| 首页欧美精品中文字幕| 精品视频一区二区三区四区五区| 影院欧美亚洲| 精品国产不卡| 蜜桃av一区二区三区电影| 久久精品一区| 在线综合欧美| 国产精品白丝久久av网站| 99久久亚洲精品蜜臀| 日本成人在线视频网站| 日韩在线欧美| 日韩avvvv在线播放| 亚洲国产专区校园欧美| 国产精品亚洲综合久久| 99在线精品视频在线观看| 精品午夜视频| 婷婷亚洲精品| 国产一区91| 性欧美videohd高精| 国产精品一卡| 日韩中文字幕区一区有砖一区| 水蜜桃精品av一区二区| 一区二区三区午夜视频| 日韩在线观看不卡| 国产福利资源一区| 天海翼亚洲一区二区三区| 四虎4545www国产精品 | 欧美91福利在线观看| 美女视频黄久久| 亚洲一区二区三区在线免费| а√天堂中文在线资源8| 日本va欧美va瓶| 亚洲女同中文字幕| 日韩国产欧美| 国产高清日韩| 日韩av一区二| 免费在线看一区| 91精品一区国产高清在线gif| 国产精品久久久久av蜜臀| 亚洲在线久久| 国产综合欧美| 国产精品字幕| 国产精品久久久久蜜臀| 国产极品模特精品一二| 欧美一级二级视频| 日韩在线卡一卡二| 99在线观看免费视频精品观看| av免费不卡国产观看| 国产免费av一区二区三区| 亚洲精品系列| 蜜臀久久久99精品久久久久久| 国产一区清纯| 色在线视频观看| 国产精品99视频| 美女高潮久久久| 欧美国产亚洲精品| 国产精品毛片aⅴ一区二区三区| 亚洲免费福利一区| 免费看日韩精品| 午夜在线播放视频欧美| 亚洲精品电影| 中日韩男男gay无套| 99久久99视频只有精品| 久久久久一区| 激情欧美一区| 婷婷亚洲综合| 欧美精品自拍| 亚洲一区二区三区高清| 六月婷婷一区| 视频一区二区国产| 日本在线一区二区三区| 日韩精品视频中文字幕| 亚洲制服欧美另类| 日韩国产高清在线| 欧美日韩18| 国产精区一区二区| 久久精品国产999大香线蕉| 欧美精品91| 日韩av在线中文字幕| 97欧美在线视频| se01亚洲视频| 婷婷综合网站| 一区二区精彩视频| 日本不卡视频在线| 欧美日一区二区在线观看| 国产精品调教视频| 久久影院资源站| 色婷婷狠狠五月综合天色拍| 美女网站一区| 石原莉奈在线亚洲二区| 涩涩涩久久久成人精品| 国产乱人伦精品一区| 国产精品羞羞答答在线观看| 精品亚洲成人| 999久久久精品国产| 中文亚洲免费| 亚州欧美在线| 国产日韩在线观看视频| 美女久久久精品| 欧美gv在线| 首页国产欧美久久| 日韩精品亚洲专区| 成人在线视频免费看| 久久精品av| 在线免费观看亚洲| 国产劲爆久久| 日韩精品免费一区二区三区| 国产综合婷婷| 青青草91久久久久久久久| 福利视频一区| 亚洲欧洲一区| 国产一卡不卡| 久久男人av资源站| 亚洲一区免费| 欧美日韩亚洲一区在线观看| 国产成人免费视频网站视频社区| 欧美性感美女一区二区| 视频一区日韩精品| 国产999精品在线观看| 91久久亚洲| 国产精品一区二区三区美女| 日韩精品网站| 无码日韩精品一区二区免费| 国产精品99视频| 99香蕉国产精品偷在线观看| 国产日韩高清一区二区三区在线| 国内精品亚洲| 午夜在线精品| 国产一区二区精品久| 视频一区视频二区中文字幕| 精品黄色一级片| 水野朝阳av一区二区三区| 久久99国产精品视频| 久久高清免费观看| 韩国女主播一区二区三区| 亚洲免费网址| 毛片在线网站| 中文不卡在线| 国产一二在线播放| 婷婷综合电影| 蜜桃tv一区二区三区| 欧美国产不卡| 蜜桃久久精品一区二区| 在线一区av| 国产欧美日韩免费观看| 9久re热视频在线精品| 精品日韩一区| 亚洲精品免费观看| 久久美女性网| 91嫩草精品| 久久亚洲精品伦理| 日韩在线欧美| 国产亚洲久久| 香蕉久久夜色精品国产|