我們先來介紹下鎖池與等待池的概念。
首先來看下鎖池的概念
所有需要競爭同步鎖的線程都會放在鎖池當中,比如當前對象的鎖已經(jīng)被其中一個線程得到,則其它線程需要在這個鎖池進行等待,當前面的線程釋放同步鎖侯鎖池中的線程去競爭同步鎖,當某個線程得到后會進入就緒隊列進行等待cpu資源分配。
接著來看看等待池的概念
當我們調(diào)用wait() 方法后,線程會放到等待池中,等待池的線程是不會去競爭同步鎖。只有調(diào)用了notify() 或notifyAll() 后等待池的線程才會開始去競爭鎖,notify() 是隨機從等待池選出一個線程放到鎖池,而notifyAll() 是將等待池的所有線程放到鎖池當中。
sleep 是 Thread 類的靜態(tài)本地方法,wait 則是Object的本地方法。
sleep 方法不會釋放lock,但是wait 會釋放,而且會加入到等待隊列中。
sleep就是把cpu的執(zhí)行資格和執(zhí)行權(quán)釋放出去,不再運行此線程,當定時事件結(jié)束再取回cpu資源,參與cpu的調(diào)度,獲取到cpu資源后就可以繼續(xù)運行了,而如果sleep時該線程有鎖,那么sleep不會釋放這個鎖,而是把鎖帶著進入了凍結(jié)狀態(tài),也就是說其它需要這個鎖的線程根本不可能獲取到這個鎖。也就是說無法執(zhí)行程序,如果在睡眠期間其它線程調(diào)用了這個線程的interrupt方法,那么這個線程也會拋出interruptexception異常返回,這點和wait是一樣的。
sleep方法不依賴于同步器synchronized,但是wait需要依賴synchronized關(guān)鍵字。
sleep不需要被喚醒(休眠之后退出阻塞),但是wait需要(不指定時間需要被別人中斷)。
sleep一般用于當前線程休眠,或者輪詢暫停操作,wait則多用于多線程之間的通信。
sleep會讓出CPU執(zhí)行時間且強制上下文切換,而wait則不一定,wait后可能還是有機會重新競爭到鎖繼續(xù)執(zhí)行的。
yield() 執(zhí)行后線程直接進入就緒狀態(tài),馬上釋放了cpu的執(zhí)行權(quán),但是依然保留了cpu的執(zhí)行資格,所以由可能cpu下次進行線程調(diào)度還會讓這個線程獲取到執(zhí)行權(quán)繼續(xù)執(zhí)行。
(學習視頻分享:java視頻教程)
join() 執(zhí)行后線程進入阻塞狀態(tài),例如在線程B中調(diào)用線程A的join() ,那線程B會進入到阻塞隊列,指導線程A結(jié)束或中斷線程。
public static void main(String[] args) throws InterruptedException { Thread t1=new Thread(()->{ try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("休眠sleep線程"); }); t1.start(); t1.join(); System.out.println("線程執(zhí)行完成"); }
原文鏈接:https://blog.csdn.net/lxn1023143182/article/details/114134498
相關(guān)推薦:java面試題及答案
Atas ialah kandungan terperinci 面試官:請你說一下sleep()、wait()、join()和yield()的區(qū)別. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Memilih imej Docker untuk Node mungkin kelihatan seperti perkara remeh, tetapi saiz dan potensi kelemahan imej itu boleh memberi kesan yang ketara pada proses dan keselamatan CI/CD anda. Jadi bagaimana kita memilih imej Node.js Docker yang terbaik?

Cross-domain ialah senario yang sering dihadapi dalam pembangunan, dan ia juga merupakan isu yang sering dibincangkan dalam temu bual. Menguasai penyelesaian merentas domain biasa dan prinsip di sebaliknya bukan sahaja boleh meningkatkan kecekapan pembangunan kami, tetapi juga menunjukkan prestasi yang lebih baik dalam temu duga.

Corak singleton JS ialah corak reka bentuk yang biasa digunakan yang memastikan bahawa kelas hanya mempunyai satu contoh. Mod ini digunakan terutamanya untuk mengurus pembolehubah global untuk mengelakkan konflik penamaan dan pemuatan berulang. Ia juga boleh mengurangkan penggunaan memori dan meningkatkan kebolehselenggaraan dan skalabiliti.

Rangka kerja Go ialah satu set komponen yang memanjangkan perpustakaan terbina dalam Go, menyediakan kefungsian pra-bina (seperti pembangunan web dan operasi pangkalan data). Rangka kerja Go yang popular termasuk Gin (pembangunan web), GORM (operasi pangkalan data) dan RESTful (pengurusan API). Middleware ialah corak pemintas dalam rantai pemprosesan permintaan HTTP dan digunakan untuk menambah fungsi seperti pengesahan atau pengelogan permintaan tanpa mengubah suai pengendali. Pengurusan sesi mengekalkan status sesi dengan menyimpan data pengguna Anda boleh menggunakan gorila/sesi untuk mengurus sesi.

Apa itu JPA? Bagaimanakah ia berbeza daripada JDBC? JPA (JavaPersistence API) ialah antara muka standard untuk pemetaan hubungan objek (ORM), yang membenarkan pembangun Java menggunakan objek Java biasa untuk mengendalikan pangkalan data tanpa menulis pertanyaan SQL secara langsung terhadap pangkalan data. JDBC (JavaDatabaseConnectivity) ialah API standard Java untuk menyambung ke pangkalan data Ia memerlukan pembangun menggunakan pernyataan SQL untuk mengendalikan pangkalan data. JPA merangkum JDBC, menyediakan API yang lebih mudah dan tahap lebih tinggi untuk pemetaan hubungan objek, dan memudahkan operasi capaian data. Dalam JPA, apakah entiti? entiti

Bagaimanakah JavaScript menentukan jenis data? Artikel ini akan berkongsi dengan anda 8 cara untuk menggunakan JS untuk menentukan jenis data, yang boleh membantu kerja dan temu bual dengan berkesan.

Modul url dan modul rentetan pertanyaan ialah dua modul pemprosesan URL yang sangat penting. Ia sering digunakan semasa membangunkan pelayan nod.

Artikel ini menyusun dan berkongsi 100 soalan temuduga PHP biasa (dengan jawapan dikongsi) untuk membantu anda menyusun pengetahuan asas dan meningkatkan rizab pengetahuan PHP anda. Ia mempunyai nilai rujukan tertentu Rakan-rakan yang memerlukan boleh merujuk kepadanya.
