最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)線程阻塞式方法

 更新時(shí)間:2024年10月23日 10:41:05   作者:Flying_Fish_Xuan  
Java阻塞式方法會(huì)使線程暫停執(zhí)行,不占用CPU資源直至條件滿足,常見(jiàn)阻塞方法如Thread.sleep()、Object.wait()和I/O操作,具有一定的參考價(jià)值,感興趣的可以了解一下

在Java編程中,阻塞式方法(blocking methods)指的是那些在被調(diào)用后,當(dāng)前線程會(huì)暫停執(zhí)行,直到某些條件滿足或事件發(fā)生后才繼續(xù)運(yùn)行的方法。在這種情況下,當(dāng)前線程會(huì)進(jìn)入阻塞狀態(tài)(blocking state),并且不會(huì)占用CPU資源,但也無(wú)法執(zhí)行任何其他操作,直到該方法完成或條件滿足。

1. 阻塞式方法的特點(diǎn)

阻塞式方法通常有以下幾個(gè)特點(diǎn):

  • 暫停線程執(zhí)行:調(diào)用阻塞式方法的線程會(huì)被掛起,進(jìn)入阻塞狀態(tài),直到方法返回或條件滿足為止。
  • 不占用CPU資源:阻塞狀態(tài)下的線程不會(huì)消耗CPU時(shí)間片,因此不會(huì)對(duì)系統(tǒng)性能造成直接負(fù)擔(dān),但它會(huì)阻止線程執(zhí)行其他任務(wù)。
  • 依賴外部條件:阻塞式方法通常等待某種外部條件或事件,例如I/O操作完成、鎖釋放、線程被喚醒等。
  • 潛在的影響:如果沒(méi)有妥善處理,阻塞式方法可能導(dǎo)致線程長(zhǎng)時(shí)間處于等待狀態(tài),進(jìn)而影響應(yīng)用程序的響應(yīng)能力和并發(fā)性能。

2. Java中的常見(jiàn)阻塞式方法

在Java中,有許多常見(jiàn)的阻塞式方法,它們通常出現(xiàn)在多線程編程、I/O操作和網(wǎng)絡(luò)編程中。

2.1 Thread.sleep()

Thread.sleep(long millis) 是一個(gè)阻塞式方法,用于使當(dāng)前線程休眠指定的毫秒數(shù)。在此期間,線程處于阻塞狀態(tài),不會(huì)執(zhí)行任何操作,直到指定的時(shí)間過(guò)去。

public class SleepExample {
    public static void main(String[] args) {
        System.out.println("Thread is going to sleep...");
        try {
            Thread.sleep(2000);  // 線程休眠2秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Thread woke up!");
    }
}

在這個(gè)例子中,Thread.sleep(2000) 使當(dāng)前線程阻塞2秒,之后繼續(xù)執(zhí)行。

2.2 Object.wait()

Object.wait() 是一個(gè)阻塞式方法,它使當(dāng)前線程進(jìn)入等待狀態(tài),直到其他線程調(diào)用 notify() 或 notifyAll() 方法喚醒它。通常用于線程間的同步和通信。

public class WaitNotifyExample {
    private static final Object lock = new Object();

    public static void main(String[] args) {
        Thread waitingThread = new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("Thread is waiting...");
                    lock.wait();  // 線程進(jìn)入等待狀態(tài)
                    System.out.println("Thread is resumed!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread notifyingThread = new Thread(() -> {
            synchronized (lock) {
                System.out.println("Thread is notifying...");
                lock.notify();  // 喚醒等待的線程
            }
        });

        waitingThread.start();
        try {
            Thread.sleep(1000);  // 確保waitingThread進(jìn)入等待狀態(tài)
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        notifyingThread.start();
    }
}

在這個(gè)例子中,wait() 方法使 waitingThread 進(jìn)入等待狀態(tài),直到 notifyingThread 調(diào)用 notify() 方法將其喚醒。

2.3 Thread.join()

Thread.join() 是一個(gè)阻塞式方法,它讓當(dāng)前線程等待另一個(gè)線程完成執(zhí)行后再繼續(xù)。例如,如果在主線程中調(diào)用 t.join(),主線程將被阻塞,直到線程 t 運(yùn)行完畢。

public class JoinExample {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            try {
                Thread.sleep(2000);
                System.out.println("Thread finished execution");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        t.start();

        try {
            t.join();  // 主線程等待t線程完成
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Main thread continues after t finishes");
    }
}

在這個(gè)例子中,t.join() 使主線程阻塞,直到 t 線程執(zhí)行完畢。

2.4 I/O 操作中的阻塞方法

在Java中,I/O操作(如文件讀寫、網(wǎng)絡(luò)通信)通常是阻塞式的。例如,InputStream.read() 方法在沒(méi)有數(shù)據(jù)可供讀取時(shí)會(huì)使當(dāng)前線程阻塞,直到數(shù)據(jù)可用或達(dá)到流的末尾。

import java.io.FileInputStream;
import java.io.IOException;

public class FileReadExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("example.txt")) {
            int data;
            while ((data = fis.read()) != -1) {  // read() 是阻塞式方法
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在這個(gè)例子中,fis.read() 方法會(huì)阻塞,直到讀取到數(shù)據(jù)或文件的末尾。

2.5 網(wǎng)絡(luò)編程中的阻塞方法

在網(wǎng)絡(luò)編程中,Socket.accept()、SocketInputStream.read() 等方法也是阻塞式的。例如,ServerSocket.accept() 方法會(huì)阻塞當(dāng)前線程,直到有客戶端連接到服務(wù)器。

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketExample {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8080)) {
            System.out.println("Server is listening on port 8080...");
            Socket clientSocket = serverSocket.accept();  // accept() 是阻塞式方法
            System.out.println("Client connected: " + clientSocket.getInetAddress());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在這個(gè)例子中,serverSocket.accept() 方法會(huì)阻塞,直到有客戶端連接到服務(wù)器。

3. 阻塞式方法的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 簡(jiǎn)單易用:阻塞式方法的邏輯簡(jiǎn)單、易于理解,開(kāi)發(fā)者不需要處理復(fù)雜的異步邏輯或回調(diào)。
  • 資源管理容易:由于阻塞式方法通常不會(huì)頻繁占用CPU資源,因此在處理I/O操作時(shí)比較高效。
  • 自然的控制流:阻塞式方法遵循自然的控制流,代碼更加直觀,不需要分離處理邏輯。

缺點(diǎn)

  • 潛在的性能問(wèn)題:如果線程長(zhǎng)時(shí)間阻塞,會(huì)導(dǎo)致線程池中的線程被占用,可能導(dǎo)致應(yīng)用程序的響應(yīng)能力下降或死鎖。
  • 可能導(dǎo)致線程饑餓:在多線程環(huán)境中,長(zhǎng)時(shí)間阻塞可能導(dǎo)致其他線程無(wú)法獲得執(zhí)行機(jī)會(huì),進(jìn)而引發(fā)線程饑餓問(wèn)題。
  • 不適用于高并發(fā)場(chǎng)景:在高并發(fā)應(yīng)用中,過(guò)多的阻塞式方法可能導(dǎo)致線程數(shù)量激增,增加內(nèi)存開(kāi)銷和線程上下文切換的開(kāi)銷。

4. 替代方案:非阻塞式方法與異步編程

由于阻塞式方法的固有缺陷,尤其是在高并發(fā)和實(shí)時(shí)性要求高的系統(tǒng)中,通常會(huì)考慮使用非阻塞式方法或異步編程模型。

4.1 非阻塞式I/O

Java NIO(New I/O)庫(kù)引入了非阻塞I/O,允許線程在沒(méi)有數(shù)據(jù)可用時(shí)繼續(xù)執(zhí)行其他任務(wù)。通過(guò)選擇器(Selector)模型,可以實(shí)現(xiàn)一個(gè)線程管理多個(gè)I/O通道的操作,從而提高并發(fā)性能。

import java.io.IOException;
import java.nio.channels.*;
import java.net.InetSocketAddress;

public class NonBlockingServerExample {
    public static void main(String[] args) throws IOException {
        Selector selector = Selector.open();
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(8080));
        serverSocketChannel.configureBlocking(false);
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
            selector.select();
            for (SelectionKey key : selector.selectedKeys()) {
                if (key.isAcceptable()) {
                    ServerSocketChannel server = (ServerSocketChannel) key.channel();
                    SocketChannel client = server.accept();
                    client.configureBlocking(false);
                    client.register(selector, SelectionKey.OP_READ);
                    System.out.println("Connected to client: " + client.getRemoteAddress());
                }
                // Handle other operations like OP_READ, OP_WRITE
            }
            selector.selectedKeys().clear();
        }
    }
}

4.2 異步編程模型

Java的 CompletableFuture 提供了強(qiáng)大的異步編程支持。通過(guò) CompletableFuture,你可以在非阻塞的情況下處理異步任務(wù)。

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep

(2000); // 模擬長(zhǎng)時(shí)間操作
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Result after 2 seconds";
        }).thenAccept(result -> {
            System.out.println("Received: " + result);
        });

        System.out.println("Main thread continues...");
    }
}

在這個(gè)例子中,異步任務(wù)在后臺(tái)運(yùn)行,主線程不必等待它完成,可以繼續(xù)執(zhí)行其他操作。

5. 總結(jié)

阻塞式方法是Java編程中處理線程同步、I/O操作和網(wǎng)絡(luò)通信的常見(jiàn)方式。雖然它們易于使用,但在高并發(fā)和性能要求高的應(yīng)用中,阻塞式方法可能會(huì)導(dǎo)致性能瓶頸。因此,開(kāi)發(fā)者需要根據(jù)具體的應(yīng)用場(chǎng)景,權(quán)衡使用阻塞式方法與非阻塞式方法或異步編程模型。

  • 阻塞式方法的優(yōu)點(diǎn):簡(jiǎn)單易用,適合處理順序執(zhí)行的任務(wù)。
  • 阻塞式方法的缺點(diǎn):在高并發(fā)或?qū)崟r(shí)性要求高的系統(tǒng)中可能導(dǎo)致性能問(wèn)題。
  • 非阻塞與異步替代方案:Java NIO和 CompletableFuture 提供了更高效的解決方案,適用于需要處理大量并發(fā)任務(wù)的場(chǎng)景。

通過(guò)理解阻塞式方法的工作原理及其適用場(chǎng)景,開(kāi)發(fā)者可以更好地設(shè)計(jì)和優(yōu)化Java應(yīng)用程序,滿足不同場(chǎng)景下的性能需求。

到此這篇關(guān)于java實(shí)現(xiàn)線程阻塞式方法的文章就介紹到這了,更多相關(guān)java 線程阻塞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot通過(guò)注解監(jiān)測(cè)Controller接口的代碼示例

    SpringBoot通過(guò)注解監(jiān)測(cè)Controller接口的代碼示例

    在Spring Boot中,度量指標(biāo)(Metrics)是監(jiān)控和診斷應(yīng)用性能與行為的重要工具,Spring Boot通過(guò)集成Micrometer和Spring Boot Actuator,提供了強(qiáng)大的度量指標(biāo)收集與暴露功能,本文介紹了SpringBoot通過(guò)注解監(jiān)測(cè)Controller接口,需要的朋友可以參考下
    2024-07-07
  • Spring中AOP概念與兩種動(dòng)態(tài)代理模式原理詳解

    Spring中AOP概念與兩種動(dòng)態(tài)代理模式原理詳解

    AOP是面向切面編程的技術(shù),AOP基于IoC基礎(chǔ),是對(duì)OOP的有益補(bǔ)充,流行的AOP框架有Sping AOP、AspectJ,這篇文章主要給大家介紹了關(guān)于Spring中AOP概念與兩種動(dòng)態(tài)代理模式原理的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Springboot-Shiro基本使用詳情介紹

    Springboot-Shiro基本使用詳情介紹

    這篇文章主要介紹了Springboot-Shiro基本使用詳情,文章根據(jù)官網(wǎng)依據(jù)官網(wǎng)快速搭建Quickstart,配置pom.xml依賴等操作,需要的小伙伴可以參考下面文章內(nèi)容
    2022-01-01
  • Java字符串編碼解碼性能提升的技巧分享

    Java字符串編碼解碼性能提升的技巧分享

    這篇文章主要是和大家分享幾個(gè)Java中提升字符串編碼解碼性能的小技巧,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的幫助,需要的可以參考一下
    2022-05-05
  • SpringBoot構(gòu)建企業(yè)級(jí)RESTful API項(xiàng)目的完整指南

    SpringBoot構(gòu)建企業(yè)級(jí)RESTful API項(xiàng)目的完整指南

    在現(xiàn)代軟件開(kāi)發(fā)中,RESTful API已成為構(gòu)建分布式系統(tǒng)和微服務(wù)架構(gòu)的標(biāo)準(zhǔn)方式,本指南將帶大家從零開(kāi)始,使用Spring Boot構(gòu)建一個(gè)完整的企業(yè)級(jí)RESTful API項(xiàng)目
    2025-07-07
  • java如何實(shí)現(xiàn)socket連接方法封裝

    java如何實(shí)現(xiàn)socket連接方法封裝

    這篇文章主要介紹了java實(shí)現(xiàn)socket連接方法封裝教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中類的定義和初始化示例詳解

    Java中類的定義和初始化示例詳解

    這篇文章主要給大家介紹了關(guān)于Java中類的定義和初始化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Nacos框架與原理之Nacos的參數(shù)

    Nacos框架與原理之Nacos的參數(shù)

    這篇文章主要介紹了Nacos框架與原理之Nacos的參數(shù),Nacos?中的參數(shù)有很多,如:命名空間、分組名、服務(wù)名、保護(hù)閾值、服務(wù)路由類型、臨時(shí)實(shí)例等,但下面文章我們要講解的是參數(shù),參數(shù)是什么呢,下面一起進(jìn)去文章學(xué)習(xí)詳細(xì)內(nèi)容吧
    2022-05-05
  • 詳解使用spring boot admin監(jiān)控spring cloud應(yīng)用程序

    詳解使用spring boot admin監(jiān)控spring cloud應(yīng)用程序

    本篇文章主要介紹了詳解使用spring boot admin監(jiān)控spring cloud應(yīng)用程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • java 如何往已經(jīng)存在的excel表格里面追加數(shù)據(jù)的方法

    java 如何往已經(jīng)存在的excel表格里面追加數(shù)據(jù)的方法

    這篇文章主要介紹了java 如何往已經(jīng)存在的excel表格里面追加數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論

萝北县| 古浪县| 鄂尔多斯市| 娱乐| 波密县| 康马县| 岳西县| 临汾市| 潞西市| 九龙城区| 江安县| 杂多县| 石景山区| 尉氏县| 惠东县| 靖边县| 龙南县| 芜湖县| 咸宁市| 平凉市| 奉节县| 龙山县| 湛江市| 吉首市| 类乌齐县| 府谷县| 洞口县| 奉节县| 金山区| 天全县| 越西县| 洮南市| 九龙坡区| 博野县| 周口市| 西贡区| 白山市| 宣城市| 奉新县| 宜宾县| 广平县|