91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java基礎之多線程

發布時間:2020-10-21 09:33:12 來源:腳本之家 閱讀:180 作者:小刀愛編程 欄目:編程語言

線程中run()和start()的區別:
對于Thread對象來說,當你調用的是start(),線程會被放到等待隊列,等待CPU調度,不一定馬上執行;無需等待run()方法執行完畢,可以直接執行下面的代碼;
而調用的是run()的話,就是當做普通的方法調用,程序還是要順序執行的;
新建線程的幾種方式:
實現Runnable接口;里面實現run()方法;
然后把這個實現了Runnable接口的類就新建為一個Thread t = new Thread(new (實現Runnable接口的類)),調用start()方法即可開始一個線程了。記住,start()只是開啟,然后就會返回,繼續執行start()下面的語句了。

線程執行器:
我們可以通過不同的線程執行器來實現多線程的執行,有以下幾種執行器:

ExecutorService exec = Executors.newCachedThreadPool();

ExecutorService exec = Executors.newFixedThreadPool(5);

ExecutorService exec = Executors.newSingleThreadExecutor();

我們可以對比一下這三者的區別:第一個執行會為每一個任務都創建一個線程,
而第二個則是可以一次性指定要分配多少線程,而第三個則是屬于單線程,會一個線程一個線程的依次執行;

休眠:
會使得任務中斷一段時間,相當于變相的阻塞了,可以給其他線程制造機會去執行;
但是我們不能通過sleep()來試圖控制線程的順序執行,而是要考慮用同步控制來實現;

讓步:
通過使用yield()方法來給線程調度機制一個暗示:你的工作已經完成的差不多了,可以讓別的線程使用CPU了,其功能上跟sleep()其實是差不多的。

后臺線程:
指在程序運行的時候在后臺提供一種通用服務的線程,并且這種線程并不屬于程序總共不可或缺的部分,當所有非后臺線程結束時,程序終止;由后臺線程創建的線程也是后臺線程;
在線程調用start()之前,調用setDaemon(true);

實現多線程的另一種方式:
通過繼承Thread的方式來實現:而且run()方法是放在構造函數里面的,也就是說,當初始化一個線程的時候,就自動的開啟了線程,記得run()方法里面一般都是一個while()循環;

加入一個線程:
一個線程可以在其他線程之上調用join()方法,如果某個線程在另一個線程t上調用t.join();此線程將被掛起,知道目標線程t結束才恢復;
join()方法,你在一個線程中join()了一個線程進來,你就要等待這個線程結束了,才可以把自己這個線程給結束掉;join()的底層實現是wait()方法;

同步:
Synchronzied;可以用在方法上,也可以用到類上面;

顯式地使用lock對象
先用Lock lock = new ReentrantLock();建出一個鎖對象出來,然后在方法里面,先調用lock.lock();然后try語句里面是方法體,最后記得要在finally里面加上lock.unlock();這樣就就相當于解鎖了。

區別:
可以看到synchronized lock相比起來,lock似乎要加上一些try/catch語句才可以,但是,這也是好處之一,比起synchronized,可以多出來處理的過程,讓用戶出現錯誤的可能性降低;
使用原子類也可以實現資源共享的問題,但是原子類一般很少在常規編程中用到,用于性能調優,然后AtomicInteger,AtomicLong等原子類,使用這些的時候,不需要用到synchronized和lock,但是原子類很少用到,所以我們還是用synchronized和lock。

線程的狀態:
新建;就緒;阻塞;死亡;

導致阻塞的幾個原因:
1,通過調用sleep()使任務進入休眠狀態,

2,通過調用wait()使線程掛起,知道線程得到notify()notifyAll()消息,

3,任務再等待某個輸入/輸出完成;

4,任務視圖在某個對象上調用其同步控制方法,但是對象鎖不可用,因為另一個任務已經獲取了這個鎖;

中斷:
這是一個大學問呀。一般的話,我們中斷都是用interrupted(),但是,我們現在說了,用Executor執行器可以更好地執行了,所以我們如如何在執行器中中斷線程呢?這也很好辦,用Executor的shutdownNow(),但是,這又是一個問題了,這只是用來中斷所有的線程的,但是我們是想要中斷某一個線層那該怎么辦呢?這就用到了返回式了,通過submit()來啟動任務的時候,我們就能夠得到返回的類型Future<?>通過這個去調用calcel()來中斷某個線程。具體等一下碼,現在還要討論的還有一個問題,中斷的線程是否有一些是無法中斷的,判定如下:如果是在sleep()中的線程,那么顯然是可以中斷的,但是對于正在讀取I/O的線程和正在試圖獲取鎖的線程,我們是無法中斷的,而中斷線程就相當于拋出了一個異常,方便我們關閉掉資源。

線程之間的協作:
當線程同時運行多個任務時,我們可以用鎖來同步兩個任務的行為,同時也可以用wait()notifyAll()來實現對線程的控制;
wait()就是一種掛起的狀態,當你掛起了之后,鎖將被釋放,把空出來的線程,給別人執行,而等到被調用notify()喚醒之后,又會重新獲得之前wait()鎖,如果這個時候鎖正在被使用的話,就要陷入等待了。

wait()跟sleep()之間的區別:
1,在synchronized中,wait()期間對象鎖是釋放的;而sleep()鎖是不會釋放的;

2,可以通過notify(),notifyAll(),或者令時間到期,從wait()中恢復執行;

喚醒的區別:
notify()方法保證的喚醒是指喚醒的是恰當的任務,另外,為了使用notify(),你必須等待相同的條件,而對于notifyAll()來說,是否所有的線程都會被喚醒呢?只有當notifyAll()因某個特定鎖被調用時,只有等待這個鎖的任務才能被喚醒;

除了wait()和notify(),我們還可以顯式地使用lock和Condition對象;
使用互斥并允許任務掛起的基本類是Condition;可以通過在Condition上調用await來掛起一個任務,通過signal()來通知這個任務,喚醒這個任務,或者調用signalAll()來喚醒所有在這個Condition上被其自身掛起的任務;與使用notify()相比,signlAll()是更安全的方式;

Lock lock = new ReentrantLock();

Condition condition = lock.newCondition();

lock.lock();

lock.unlock();

condition.await();

但是我們要知道顯式的lock對象,相比起wait(),notify()來說,更加復雜,所以還是建議用回原來的那個wait(),LockCondition只有在更加困難的多線程問題才是必需的;

死鎖:
當某一個任務在等待另一個任務的鎖釋放,而下一個任務又在等待上一個鎖的釋放,在這樣呈鏈式的循環里面,直到這個鏈條上的任務又在等待第一個任務釋放鎖,得到了一個任務之間的相互等待的連續循環;稱為死鎖;
哲學家就餐問題;經典的死鎖問題;
發生死鎖的四個滿足條件:

1,互斥條件,任務使用的資源中國至少有一個是不能共享的。

2,至少有一個任務它必須持有一個資源把那個正在等待獲取另一個被別的任務持有的資源;

3,資源不能被任務搶占;

4,必須要有等待循環;

防止死鎖的最容易的方式是破壞第四個條件。

總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。如果你想了解更多相關內容請查看下面相關鏈接

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

土默特右旗| 莱芜市| 泗洪县| 绍兴县| 嵩明县| 江油市| 永胜县| 泽普县| 庆阳市| 惠水县| 获嘉县| 文安县| 宁南县| 密云县| 苗栗县| 顺昌县| 双柏县| 大化| 肥东县| 军事| 奈曼旗| 沙洋县| 巴塘县| 固阳县| 冀州市| 连南| 威远县| 五莲县| 四会市| 汝阳县| 屏南县| 抚宁县| 容城县| 澄江县| 监利县| 原平市| 海晏县| 桦南县| 时尚| 永定县| 鲁甸县|