国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java——線程睡眠全方位解析

這篇具有很好參考價值的文章主要介紹了Java——線程睡眠全方位解析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

線程睡眠的方法:

在 Java 中,讓線程休眠的方法有很多,這些方法大致可以分為兩類,一類是設置時間,在一段時間后自動喚醒,而另一個類是提供了一對休眠和喚醒的方法,在線程休眠之后,可以在任意時間對線程進行喚醒。

線程睡眠的方法有以下 5 個:

  • Thread.sleep
  • TimeUnit
  • wait
  • Condition
  • LockSupport

其中 sleep 和 TimeUnit 是讓線程睡眠一段時間后自動喚醒,而 wait、Condition、LockSupport 提供了一對休眠和喚醒線程的方法,可以實現(xiàn)任意時刻喚醒某個線程。

方法1:Thread.sleep

Thread類的sleep()方法用于在指定的時間內(nèi)睡眠線程。

java中sleep()方法的語法
Thread類為睡眠線程提供了兩種方法:


public static void sleep(long miliseconds)throws InterruptedException
public static void sleep(long miliseconds, int nanos)throws InterruptedException

以上程序的執(zhí)行結(jié)果如下圖所示:?

class TestSleepMethod1 extends Thread {
    public void run() {
        for (int i = 1; i < 5; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                System.out.println(e);
            }
            System.out.println(i);
        }
    }

    public static void main(String args[]) {
        TestSleepMethod1 t1 = new TestSleepMethod1();
        TestSleepMethod1 t2 = new TestSleepMethod1();

        t1.start();
        t2.start();
    }
}

以上程序的執(zhí)行結(jié)果如下所示:

1 1 2 2 3 3 4 4

方法2:TimeUnit

sleep 方法因為要傳遞一個毫秒類型的參數(shù),因此在設置大一點的時間時比較麻煩,比如設置 1 小時或 1 天時,此時我們就可以使用 TimeUnit 來替代 sleep 方法實現(xiàn)休眠。?

TimeUnit 的功能和 sleep 一樣,讓線程休眠 N 個單位時間之后自動喚醒,它的基礎(chǔ)用法如下:

以上程序的執(zhí)行結(jié)果如下圖所示:?

Thread t1 = new Thread() {
    @Override
    public void run() {
        System.out.println("線程執(zhí)行:" + LocalDateTime.now());
        try {
            TimeUnit.SECONDS.sleep(1); // 休眠 1s
            //TimeUnit.DAYS.sleep(1); // 休眠 1 天
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("線程結(jié)束:" + LocalDateTime.now());
    }
};
t1.start();

java sleep,Java基礎(chǔ)教程,java,python,開發(fā)語言

?當我們查看 TimeUnit 源碼時就會發(fā)現(xiàn),它的底層是基于 Thread.sleep 方法實現(xiàn)的,其實現(xiàn)源碼如下:?

java sleep,Java基礎(chǔ)教程,java,python,開發(fā)語言

方法3:wait

wait/notify/notifyAll 都來自于 Object 類,其中:

  • wait() / wait(long timeout):表示讓當前線程進入休眠狀態(tài)。
  • notify():喚醒當前對象上的一個休眠線程。
  • notifyAll():喚醒當前對象上的所有休眠線程。

其中 wait() 方法表示讓當前線程無限期等待下去,直到遇到 notify/notifyAll 方法時才會被喚醒,而 wait(long timeout) 表示接收一個 long 類型的超時時間,如果沒有遇到 notify/notifyAll 會在 long 毫秒之后自動喚醒,如果遇到了 notify/notifyAll 方法會立即被喚醒。 它的基礎(chǔ)用法如下:

Object lock = new Object();
new Thread(() -> {
    synchronized (lock) {
        try {
            // 讓當前線程休眠
            lock.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).start();
synchronized (lock) {
    lock.notify(); // 喚醒當前對象上一個休眠線程
    // lock.notifyAll(); // 喚醒當前對象上所有休眠的線程
}

需要注意的是 wait/notify/notifyAll 在使用時必須要配合 synchronized 一起使用,否則程序執(zhí)行會報錯。

方法4:Condition

Condition 作為 wait 的升級版,它提供的常用方法有以下幾個:

  • await():讓當前線程進入等待狀態(tài),直到被通知(signal)或者被中斷時才會繼續(xù)執(zhí)行。
  • awaitUninterruptibly():讓當前線程進入等待狀態(tài),直到被通知才會被喚醒,它對線程的中斷通知不做響應。
  • await(long time, TimeUnit unit):在 await() 方法的基礎(chǔ)上添加了超時時間,如果過了超時時間還沒有遇到喚醒方法則會自動喚醒并恢復執(zhí)行。
  • awaitUntil(Date deadline):讓當前線程進入等待狀態(tài),如果沒有遇到喚醒方法也會在設置的時間之后自動喚醒。
  • signal():喚醒一個等待在 Condition 上的線程。
  • signalAll():喚醒等待在 Condition 上所有的線程。

它的基本用法如下:

import java.time.LocalDateTime;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ConditionExample {
    public static void main(String[] args) throws InterruptedException {
        // 創(chuàng)建鎖
        final Lock lock = new ReentrantLock();
        // 創(chuàng)建 Condition
        final Condition condition = lock.newCondition();
        new Thread(() -> {
            System.out.println("線程執(zhí)行:" + LocalDateTime.now());
            lock.lock(); // 得到鎖
            try {
                // 休眠線程
                condition.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock(); // 釋放鎖
            }
            System.out.println("線程結(jié)束:" + LocalDateTime.now());
        }).start();
        Thread.sleep(1000);
        lock.lock(); // 得到鎖
        try {
            // 喚醒線程
            condition.signal();
        } finally {
            lock.unlock(); // 釋放鎖
        }
    }
}

相比于 wait 方法,Condition 對象更加靈活,因為它可以在一把鎖上定義多個 Condition 對象進行使用,

如下代碼所示:

// 創(chuàng)建鎖
final Lock lock = new ReentrantLock();
// 創(chuàng)建 Condition 1
final Condition condition = lock.newCondition();
// 創(chuàng)建 Condition 2
final Condition condition2 = lock.newCondition();
// ......

方法5:LockSupport

LockSupport 是更加底層的操作線程休眠和喚醒的對象,它提供了兩個常用的方法:

  • LockSupport.park():休眠當前線程。
  • LockSupport.unpark(Thread thread):喚醒一個指定的線程。

它的基礎(chǔ)用法如下:

Thread t1 = new Thread(() -> {

    System.out.println("線程1休眠");

    LockSupport.park(); // 休眠線程

    System.out.println("線程1執(zhí)行結(jié)束");

}, "線程1");

t1.start();


Thread t2 = new Thread(() -> {

    System.out.println("線程2休眠");

    LockSupport.park(); // 休眠線程

    System.out.println("線程2執(zhí)行結(jié)束");

}, "線程2");

t2.start();


Thread t3 = new Thread(() -> {

    try {

        Thread.sleep(1000);

    } catch (InterruptedException e) {

        e.printStackTrace();

    }

    System.out.println("喚醒線程1");

    LockSupport.unpark(t1); // 喚醒線程1

}, "線程3");

t3.start();

以上程序的執(zhí)行結(jié)果如下圖所示:

java sleep,Java基礎(chǔ)教程,java,python,開發(fā)語言

方法總結(jié)

Thread.sleep 和 TimeUnit 是讓線程休眠并在一段時間后自動喚醒,而 wait、Condition、LockSupport 提供了休眠和喚醒線程的方法,其中 Condition 為 wait 方法的升級版,而 LockSupport 是更底層的讓線程休眠和喚醒的方法,它可以實現(xiàn)喚醒某個指定的線程,這是其它方法所不具備的(功能)。

線程睡眠的作用

線程睡眠可以有效的控制線程的執(zhí)行時間,可以讓CPU資源分配更加均衡,提高程序的運行效率和穩(wěn)定性。

在并發(fā)編程中,線程經(jīng)常會被調(diào)度器打斷,通過線程睡眠,可以讓該線程“放棄”一段時間的CPU執(zhí)行權(quán),避免CPU資源浪費和競爭。另外,線程睡眠還可以用來模擬線程執(zhí)行中的等待時間,例如Java中的定時器和倒計時器的實現(xiàn),都離不開線程睡眠。

線程睡眠的注意事項

在使用線程睡眠時,需要注意以下幾個問題:

1. InterruptedException異常

在調(diào)用線程睡眠方法時,需要捕獲InterruptedException異常。InterruptedException是一個檢查異常,它是在調(diào)用線程的interrupt()方法后,拋出的一種異常。

Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });

    t.start();

    // 主線程等待子線程執(zhí)行完畢
    try {
        t.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

2. 線程睡眠不會釋放鎖

在線程睡眠期間,該線程所持有的鎖并不會被釋放,因此,其他線程仍將被阻塞。

 synchronized (obj) {
        System.out.println("獲取obj鎖");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("釋放obj鎖");
    }

3. 睡眠時間應盡量短

線程睡眠的時間應盡量短,可以根據(jù)實際需要調(diào)整線程睡眠的時間。如果睡眠時間過長,會導致程序的響應時間變慢,影響用戶體驗。另外,需要避免不必要的線程睡眠,以免影響程序的運行效率。

4. 時間單位要選對

在使用TimeUnit.MILLISECONDS.sleep()方法時,需要選擇正確的時間單位,比如:TimeUnit.SECONDS、TimeUnit.MINUTES、TimeUnit.HOURS等。

  try {
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

5. 線程睡眠不能保證精確

線程睡眠的時間并不能保證精確,它受到操作系統(tǒng)和虛擬機的干擾,可能會比預期的時間長一些,因此在實際使用中,需要考慮誤差范圍。

線程睡眠的應用場景

線程睡眠在實際應用中廣泛使用,以下是一些常見的應用場景:

1. 定時器和倒計時器

定時器和倒計時器是一種常見的實現(xiàn)方式,可以通過線程睡眠和計時器來實現(xiàn)。例如,以下代碼實現(xiàn)了一個簡單的倒計時器。

  for (int i = 10; i >= 0; i--) {
        System.out.println("倒計時:" + i);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

2. 多線程并發(fā)控制

線程睡眠可以用來控制多個線程的并發(fā),例如通過線程睡眠,可以讓多個線程按順序執(zhí)行,而不會發(fā)生同時執(zhí)行的情況。

Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (obj) {
                System.out.println("t1獲取obj鎖");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("t1釋放obj鎖");
            }
        }
    });

    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            synchronized (obj) {
                System.out.println("t2獲取obj鎖");
            }
        }
    });

    t1.start();
    t2.start();

    // 主線程等待子線程執(zhí)行完畢
    try {
        t1.join();
        t2.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

3. 提高程序的運行效率

線程睡眠可以有效的控制線程的執(zhí)行時間,可以讓CPU資源分配更加均衡,提高程序的運行效率和穩(wěn)定性。例如,以下代碼使用線程睡眠優(yōu)化了圖片加載的過程。

long start = System.currentTimeMillis();
    loadImages();
    long end = System.currentTimeMillis();
    System.out.println("圖片加載耗時:" + (end - start) + "ms");

    private void loadImages() {
        for (int i = 0; i < imageUrls.length; i++) {
            loadSingleImage(imageUrls[i]);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

總結(jié):

線程睡眠作為并發(fā)編程的重要一環(huán),不僅可以有效的控制線程的執(zhí)行時間,還可以提高程序的運行效率和穩(wěn)定性,因此在實際開發(fā)中,需要合理的應用線程睡眠技術(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-767482.html

到了這里,關(guān)于Java——線程睡眠全方位解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 【30天熟悉Go語言】9 Go函數(shù)全方位解析

    【30天熟悉Go語言】9 Go函數(shù)全方位解析

    作者 :禿禿愛健身,多平臺博客專家,某大廠后端開發(fā),個人IP起于源碼分析文章 ??。 源碼系列專欄 :Spring MVC源碼系列、Spring Boot源碼系列、SpringCloud源碼系列(含:Ribbon、Feign)、Nacos源碼系列、RocketMQ源碼系列、Spring Cloud Gateway使用到源碼分析系列、分布式事務Seata使用到

    2024年02月10日
    瀏覽(33)
  • Python教程(24)——全方位解析Python中的裝飾器

    Python裝飾器是一種特殊的函數(shù),它接收一個函數(shù)作為參數(shù),然后返回一個新的函數(shù),用于擴展或修改原始函數(shù)的行為。裝飾器提供了一種便捷的方式來在不修改被裝飾函數(shù)源代碼的情況下,增加、修改或包裝函數(shù)的功能。通俗點說就是盡量不修改原有功能代碼的情況下,給原

    2024年02月02日
    瀏覽(28)
  • 【全方位解析】如何獲取客戶端/服務端真實 IP

    【全方位解析】如何獲取客戶端/服務端真實 IP

    1.比如在投票系統(tǒng)開發(fā)中,為了防止刷票,我們需要限制每個 IP 地址只能投票一次 2.當網(wǎng)站受到諸如 DDoS(Distributed Denial of Service,分布式拒絕服務攻擊)等攻擊時,我們需要快速定位攻擊者 IP 3.在滲透測試過程中,經(jīng)常會碰到網(wǎng)站有 CDN(Content Distribution Network,內(nèi)容交付網(wǎng)絡

    2024年02月07日
    瀏覽(38)
  • Go泛型解密:從基礎(chǔ)到實戰(zhàn)的全方位解析

    Go泛型解密:從基礎(chǔ)到實戰(zhàn)的全方位解析

    本篇文章深入探討了Go語言的泛型特性,從其基礎(chǔ)概念到高級用法,并通過實戰(zhàn)示例展示了其在實際項目中的應用。 關(guān)注【TechLeadCloud】,分享互聯(lián)網(wǎng)架構(gòu)、云服務技術(shù)的全維度知識。作者擁有10+年互聯(lián)網(wǎng)服務架構(gòu)、AI產(chǎn)品研發(fā)經(jīng)驗、團隊管理經(jīng)驗,同濟本復旦碩,復旦機器人

    2024年02月08日
    瀏覽(21)
  • 深度解析知網(wǎng)AIGC檢測:從理論到實踐,全方位探索前沿技術(shù)

    深度解析知網(wǎng)AIGC檢測:從理論到實踐,全方位探索前沿技術(shù)

    大家好,小發(fā)貓降ai今天來聊聊深度解析知網(wǎng)AIGC檢測:從理論到實踐,全方位探索前沿技術(shù),希望能給大家提供一點參考。降ai輔寫 以下是針對論文AI輔寫率高的情況,提供一些修改建議和技巧,可以借助此類工具: 還有: 標題: \\\"深度解析知網(wǎng)AIGC檢測:從理論到實踐,全方

    2024年03月16日
    瀏覽(27)
  • 一文章讓你徹底了解OpenAI:CSDN獨家全方位解析

    目錄 什么是OpenAI OpenAI的發(fā)展歷程 相關(guān)名詞解釋 API? GPT? GPT-2? GPT-3?

    2024年02月09日
    瀏覽(30)
  • C++環(huán)形緩沖區(qū)設計與實現(xiàn):從原理到應用的全方位解析

    C++環(huán)形緩沖區(qū)設計與實現(xiàn):從原理到應用的全方位解析

    環(huán)形緩沖區(qū)(Circular Buffer),也被稱為循環(huán)緩沖區(qū)(Cyclic Buffer)或者環(huán)形隊列(Ring Buffer),是一種數(shù)據(jù)結(jié)構(gòu)類型,它在內(nèi)存中形成一個環(huán)形的存儲空間。環(huán)形緩沖區(qū)的特點是其終點和起點是相連的,形成一個環(huán)狀結(jié)構(gòu)。這種數(shù)據(jù)結(jié)構(gòu)在處理流數(shù)據(jù)和實現(xiàn)數(shù)據(jù)緩存等場景中具

    2024年02月07日
    瀏覽(33)
  • “探索C語言操作符的神秘世界:從入門到精通的全方位解析“

    “探索C語言操作符的神秘世界:從入門到精通的全方位解析“

    各位少年,我是博主 那一臉陽光 ,今天來分享深度解析C語言操作符,C語言操作符能幫我們解決很多邏輯性的問題,減少很多代碼量,就好比數(shù)學的各種符號,我們現(xiàn)在深度解剖一下他們。 在追求愛情的道路上,擁有吸引人的外表與內(nèi)在氣質(zhì)固然重要,它們?nèi)缤残浅剑?/p>

    2024年01月25日
    瀏覽(23)
  • npm包安裝與管理:深入解析命令行工具的全方位操作指南,涵蓋腳本執(zhí)行與包發(fā)布流程

    npm包安裝與管理:深入解析命令行工具的全方位操作指南,涵蓋腳本執(zhí)行與包發(fā)布流程

    npm,全稱為Node Package Manager,是專為JavaScript生態(tài)系統(tǒng)設計的軟件包管理系統(tǒng),尤其與Node.js平臺緊密關(guān)聯(lián)。作為Node.js的默認包管理工具,npm為開發(fā)者提供了便捷的方式來安裝、共享、分發(fā)和管理代碼模塊。 npm作為JavaScript世界不可或缺的基礎(chǔ)設施,極大地促進了代碼復用和協(xié)作

    2024年04月12日
    瀏覽(28)
  • 精彩解讀:短鏈接應用全方位探究

    精彩解讀:短鏈接應用全方位探究

    1. 短鏈接的定義和原理 短鏈接是一種將長網(wǎng)址轉(zhuǎn)換為短網(wǎng)址的服務,通過簡化網(wǎng)址長度,方便用戶分享和傳播鏈接。短鏈接服務通過將長網(wǎng)址映射到短標識符的方式,實現(xiàn)對原始網(wǎng)址的壓縮和簡化。用戶在訪問短鏈接時,系統(tǒng)會將短鏈接還原為原始長網(wǎng)址,實現(xiàn)跳轉(zhuǎn)到目標網(wǎng)

    2024年04月08日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包