欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?Guava異步編程實(shí)踐

 更新時(shí)間:2023年12月06日 08:35:39   作者:S  
今天咱們要聊的是Guava在異步編程中的應(yīng)用,讓我們搞清楚為什么要用Guava來處理異步任務(wù),在Java的世界里,異步編程是個(gè)老話題了,但它依舊非常關(guān)鍵,它能讓咱們的應(yīng)用更高效,尤其是在處理那些耗時(shí)的I/O操作

引言 - 為什么要用Guava進(jìn)行異步編程?

今天咱們要聊的是Guava在異步編程中的應(yīng)用,讓我們搞清楚為什么要用Guava來處理異步任務(wù),在Java的世界里,異步編程是個(gè)老話題了,但它依舊非常關(guān)鍵,它能讓咱們的應(yīng)用更高效,尤其是在處理那些耗時(shí)的I/O操作時(shí),但傳統(tǒng)的Java Future提供的功能太基礎(chǔ)了,用起來有點(diǎn)兒笨重,而Guava的ListenableFuture就像一股清流,給異步編程帶來了更多的靈活性和控制能力。

為什么這么說呢?Guava的異步編程工具不僅僅讓代碼看起來更簡潔,還提供了更強(qiáng)大的功能,比如可以添加回調(diào)函數(shù),組合多個(gè)異步操作,甚至更優(yōu)雅的異常處理。想象一下,咱們的程序正在處理一堆數(shù)據(jù),突然需要調(diào)用一個(gè)遠(yuǎn)程服務(wù)或者讀寫大文件,如果都用同步方式,那用戶體驗(yàn)肯定大打折扣。但有了Guava,這一切都變得簡單而高效了!

Guava的異步編程不僅僅是一種技術(shù)選擇,更是一種讓代碼更高效、更易維護(hù)的編程方式。現(xiàn)在,讓我們一起深入了解一下Guava的異步編程如何運(yùn)作的吧!

Guava異步編程基礎(chǔ)

咱們首先得了解Guava在異步編程中的基石——ListenableFuture。這是什么東西呢?簡單說,它是Java原生Future的增強(qiáng)版。在Java的Future中,你得不停地檢查操作是否完成,這不僅效率低下,而且代碼可讀性也差。但Guava的ListenableFuture就不一樣了,它允許咱們注冊回調(diào)函數(shù),一旦異步操作完成,立即得到通知,多酷啊!

來,看看怎么用。首先咱們需要一個(gè)ListeningExecutorService,這是Guava提供的專門用于ListenableFuture的執(zhí)行器??聪旅孢@段代碼:

ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));

這里,小黑創(chuàng)建了一個(gè)線程池,并用Guava的listeningDecorator方法裝飾它,使其能返回ListenableFuture。下一步,咱們提交一個(gè)任務(wù):

ListenableFuture<String> future = service.submit(new Callable<String>() {
    @Override
    public String call() throws Exception {
        // 模擬一些長時(shí)間的操作
        Thread.sleep(2000);
        return "Hello, Guava!";
    }
});

在這個(gè)例子中,小黑提交了一個(gè)Callable任務(wù),它會(huì)睡眠2秒后返回一條消息。這就是基本的異步操作。但Guava的魅力在于它能讓咱們添加回調(diào),處理異步操作的結(jié)果或者異常:

Futures.addCallback(future, new FutureCallback&lt;String&gt;() {
    @Override
    public void onSuccess(String result) {
        // 當(dāng)異步任務(wù)成功完成時(shí),這里會(huì)被調(diào)用
        System.out.println("異步處理成功,結(jié)果是:" + result);
    }

    @Override
    public void onFailure(Throwable t) {
        // 異常處理
        t.printStackTrace();
    }
}, service);

在這段代碼里,小黑用Futures.addCallback給future添加了一個(gè)回調(diào)。這樣,一旦異步任務(wù)完成,無論是成功還是失敗,相應(yīng)的方法都會(huì)被調(diào)用。這樣的處理方式既簡潔又高效。

實(shí)現(xiàn)異步任務(wù)

咱們繼續(xù)深入Guava的異步編程。在第二章節(jié),小黑給大家介紹了Guava的ListenableFuture基礎(chǔ),那現(xiàn)在,咱們來看看如何實(shí)際實(shí)現(xiàn)一個(gè)異步任務(wù)。

首先,創(chuàng)建一個(gè)異步任務(wù)并不復(fù)雜。咱們需要一個(gè)CallableRunnable任務(wù),然后通過ListeningExecutorService提交它。這聽起來跟Java的ExecutorService差不多,但Guava的妙處在于它返回的是一個(gè)ListenableFuture對象??纯聪旅娴睦樱?/p>

Callable<String> task = () -> {
    // 假設(shè)這里是一些耗時(shí)的計(jì)算
    Thread.sleep(2000);
    return "任務(wù)完成";
};

ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5));
ListenableFuture<String> future = executorService.submit(task);

這里,小黑創(chuàng)建了一個(gè)簡單的Callable任務(wù),模擬了一個(gè)耗時(shí)2秒的操作。然后用MoreExecutors.listeningDecorator裝飾了一個(gè)固定大小的線程池,以便提交ListenableFuture任務(wù)。

接下來的重點(diǎn)是如何管理這些異步任務(wù)。Guava提供了很棒的工具來處理這個(gè)問題,比如我們可以輕松地添加回調(diào)函數(shù)、等待任務(wù)完成,甚至是組合多個(gè)任務(wù)。但在此之前,咱們需要了解一下ListenableFuture的基本操作。

比如,咱們想要獲取任務(wù)的結(jié)果,可以使用future.get()方法。但要注意,這個(gè)方法會(huì)阻塞當(dāng)前線程直到任務(wù)完成。這在某些場景下可能不是最佳選擇,特別是當(dāng)你不想讓當(dāng)前線程等待時(shí)。Guava在這里提供了一個(gè)非阻塞的方案,那就是Futures.addCallback,這樣可以在任務(wù)完成時(shí)立即得到通知,而不阻塞當(dāng)前線程。

Futures.addCallback(future, new FutureCallback<String>() {
    public void onSuccess(String result) {
        // 當(dāng)任務(wù)成功完成時(shí)調(diào)用
        System.out.println("結(jié)果: " + result);
    }
    public void onFailure(Throwable thrown) {
        // 當(dāng)任務(wù)執(zhí)行異常時(shí)調(diào)用
        thrown.printStackTrace();
    }
}, executorService);

在這段代碼中,小黑為future添加了一個(gè)回調(diào)。這樣一旦任務(wù)完成,無論成功還是失敗,相應(yīng)的回調(diào)方法就會(huì)被執(zhí)行。這種方式讓異步編程變得更加靈活和強(qiáng)大。使用Guava的ListenableFuture,咱們可以優(yōu)雅地處理異步任務(wù),編寫出更清晰、更健壯的代碼。

異步回調(diào)與轉(zhuǎn)換

好了,現(xiàn)在小黑帶大家進(jìn)入Guava異步編程的下一環(huán)節(jié):異步回調(diào)與轉(zhuǎn)換。這部分內(nèi)容非常有趣,也是Guava異步編程中最強(qiáng)大的特性之一。咱們知道,在傳統(tǒng)的Java異步編程中,處理異步任務(wù)的結(jié)果往往需要阻塞等待,而Guava通過回調(diào)機(jī)制提供了一種更靈活、非阻塞的方式來處理這些結(jié)果。

回調(diào)函數(shù)的使用

首先,看看如何給一個(gè)異步任務(wù)添加回調(diào)函數(shù)。咱們已經(jīng)知道了ListenableFuture,那就讓我們用它來實(shí)踐一下。假設(shè)小黑有一個(gè)異步任務(wù),這個(gè)任務(wù)完成后,咱們想要做一些額外的處理,比如記錄日志或者通知用戶。

ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
ListenableFuture<String> future = service.submit(() -> {
    // 這里模擬一個(gè)耗時(shí)操作
    Thread.sleep(2000);
    return "任務(wù)完成";
});
Futures.addCallback(future, new FutureCallback<String>() {
    @Override
    public void onSuccess(String result) {
        // 這里處理任務(wù)成功完成的情況
        System.out.println("異步任務(wù)成功完成,結(jié)果是:" + result);
    }
    @Override
    public void onFailure(Throwable thrown) {
        // 這里處理任務(wù)失敗的情況
        System.err.println("異步任務(wù)失敗,錯(cuò)誤:" + thrown.getMessage());
    }
}, service);

在這個(gè)例子中,咱們提交了一個(gè)異步任務(wù),并通過Futures.addCallback為它添加了一個(gè)回調(diào)。這樣一來,任務(wù)完成時(shí),無論成功還是失敗,對應(yīng)的方法都會(huì)被執(zhí)行,而且不會(huì)阻塞咱們的主線程。

異步結(jié)果的轉(zhuǎn)換

另一個(gè)有趣的特性是結(jié)果轉(zhuǎn)換。在某些情況下,咱們可能需要將異步任務(wù)的輸出轉(zhuǎn)換成另一種格式或類型。Guava的Futures.transform方法在這里就派上用場了??纯聪旅孢@個(gè)例子:

ListenableFuture<String> transformedFuture = Futures.transform(future, new Function<String, String>() {
    @Override
    public String apply(String input) {
        // 這里將輸入轉(zhuǎn)換為大寫
        return input.toUpperCase();
    }
}, service);
// 添加回調(diào)以處理轉(zhuǎn)換后的結(jié)果
Futures.addCallback(transformedFuture, new FutureCallback<String>() {
    @Override
    public void onSuccess(String result) {
        System.out.println("轉(zhuǎn)換后的結(jié)果:" + result);
    }
    @Override
    public void onFailure(Throwable t) {
        System.err.println("轉(zhuǎn)換失敗:" + t.getMessage());
    }
}, service);

在這個(gè)例子中,咱們使用了Futures.transform來將原始異步任務(wù)的結(jié)果轉(zhuǎn)換成大寫。這樣的轉(zhuǎn)換是非阻塞的,并且可以鏈?zhǔn)秸{(diào)用,非常方便。

Guava允許咱們靈活地管理和操作異步任務(wù)的結(jié)果,使得代碼更加簡潔和易于維護(hù)。這種方式不僅提高了代碼的可讀性,也提升了編程的效率。

錯(cuò)誤處理和異常管理

當(dāng)咱們談?wù)摦惒骄幊?,一個(gè)不得不提的話題就是錯(cuò)誤處理和異常管理。在傳統(tǒng)的同步編程中,咱們通常會(huì)用try-catch塊來處理異常。但在異步編程中,事情會(huì)稍微復(fù)雜一些。好消息是,Guava提供了一些非常實(shí)用的工具來幫助咱們在異步環(huán)境中更加優(yōu)雅地處理異常。

異常處理策略

在Guava的ListenableFuture中,如果異步任務(wù)執(zhí)行過程中發(fā)生異常,這個(gè)異常會(huì)被封裝在Future中。調(diào)用者可以通過future.get()方法來獲取結(jié)果,如果有異常發(fā)生,它會(huì)被拋出。但這種方式會(huì)阻塞調(diào)用線程,而且不是很靈活。Guava提供了更好的方法來處理這些異常。

讓小黑來展示一個(gè)例子。假設(shè)有一個(gè)異步任務(wù),它可能會(huì)拋出一個(gè)異常。咱們可以用Futures.catching來優(yōu)雅地處理它:

ListenableFuture<String> future = service.submit(() -> {
    if (new Random().nextBoolean()) {
        throw new IllegalStateException("糟糕,出錯(cuò)了!");
    }
    return "一切正常";
});
// 使用Futures.catching處理異常
ListenableFuture<String> catchingFuture = Futures.catching(future, IllegalStateException.class, 
    (Exception e) -> "出現(xiàn)異常,但被處理了!", service);
Futures.addCallback(catchingFuture, new FutureCallback<String>() {
    @Override
    public void onSuccess(String result) {
        System.out.println("結(jié)果:" + result);
    }
    @Override
    public void onFailure(Throwable t) {
        System.err.println("未捕獲的異常:" + t.getMessage());
    }
}, service);

在這個(gè)例子中,小黑創(chuàng)建了一個(gè)可能拋出IllegalStateException的異步任務(wù)。然后,咱們使用Futures.catching來處理這個(gè)異常。如果異常發(fā)生,Futures.catching會(huì)調(diào)用提供的函數(shù)來返回一個(gè)默認(rèn)值,這樣就能防止程序崩潰,并給出一個(gè)可控的結(jié)果。

異步環(huán)境中的異常管理

異常管理在異步編程中至關(guān)重要。Guava通過提供像Futures.catching這樣的工具,讓咱們能夠更好地控制異常處理的邏輯。這不僅使代碼更健壯,也提升了用戶體驗(yàn)。

另外,值得一提的是,使用這些方法可以幫助咱們編寫出更清晰、更易于維護(hù)的代碼。它減少了錯(cuò)誤處理代碼的重復(fù),并使得異步邏輯更加直觀。

組合和鏈?zhǔn)疆惒饺蝿?wù)

小黑現(xiàn)在要帶大家探索Guava中的另一項(xiàng)強(qiáng)大功能:組合和鏈?zhǔn)疆惒饺蝿?wù)。在實(shí)際開發(fā)中,咱們常常遇到需要順序執(zhí)行或并行執(zhí)行多個(gè)異步任務(wù)的情況。Guava提供了非常便利的工具來處理這些情景,讓咱們的代碼變得既簡潔又高效。

組合多個(gè)異步任務(wù)

想象一下,如果咱們有兩個(gè)獨(dú)立的異步任務(wù),需要在它們都完成后才能進(jìn)行下一步。Guava的Futures.allAsList或者Futures.successfulAsList就是為這種場景設(shè)計(jì)的。這些方法允許咱們將多個(gè)ListenableFuture實(shí)例組合成一個(gè),當(dāng)所有的Future都完成時(shí),組合后的Future也會(huì)完成。

來看看這個(gè)例子:

ListenableFuture<String> future1 = service.submit(() -> {
    // 模擬異步操作
    Thread.sleep(1000);
    return "任務(wù)1完成";
});
ListenableFuture<String> future2 = service.submit(() -> {
    // 模擬另一個(gè)異步操作
    Thread.sleep(1500);
    return "任務(wù)2完成";
});
// 將兩個(gè)Future組合成一個(gè)
ListenableFuture<List<String>> allFutures = Futures.allAsList(future1, future2);
Futures.addCallback(allFutures, new FutureCallback<List<String>>() {
    @Override
    public void onSuccess(List<String> result) {
        // 當(dāng)所有任務(wù)都成功完成后,這里會(huì)被調(diào)用
        result.forEach(System.out::println);
    }
    @Override
    public void onFailure(Throwable thrown) {
        // 如果任一任務(wù)失敗,這里會(huì)被調(diào)用
        thrown.printStackTrace();
    }
}, service);

在這個(gè)例子中,小黑創(chuàng)建了兩個(gè)異步任務(wù),然后使用Futures.allAsList將它們組合在一起。這樣,當(dāng)所有任務(wù)都完成時(shí),咱們就可以獲取它們的結(jié)果了。

鏈?zhǔn)秸{(diào)用異步任務(wù)

另一個(gè)常見的需求是鏈?zhǔn)秸{(diào)用異步任務(wù)。比如,第一個(gè)任務(wù)完成后,它的輸出將作為第二個(gè)任務(wù)的輸入。Guava的Futures.transform方法在這里又派上用場了。

看看這個(gè)例子:

ListenableFuture<String> initialFuture = service.submit(() -> {
    // 模擬一個(gè)耗時(shí)的異步操作
    Thread.sleep(1000);
    return "初步處理完成";
});
Function<String, ListenableFuture<String>> followUpTask = (input) -> service.submit(() -> {
    // 使用前一個(gè)任務(wù)的結(jié)果
    return input + ",然后進(jìn)行進(jìn)一步處理";
});
// 將初始任務(wù)和后續(xù)任務(wù)鏈接起來
ListenableFuture<String> chainedFuture = Futures.transformAsync(initialFuture, followUpTask, service);
Futures.addCallback(chainedFuture, new FutureCallback<String>() {
    @Override
    public void onSuccess(String result) {
        System.out.println("鏈?zhǔn)饺蝿?wù)的結(jié)果:" + result);
    }
    @Override
    public void onFailure(Throwable thrown) {
        thrown.printStackTrace();
    }
}, service);

在這里,小黑首先創(chuàng)建了一個(gè)初始任務(wù),然后定義了一個(gè)后續(xù)任務(wù)。通過Futures.transformAsync,咱們將這兩個(gè)任務(wù)鏈接起來,使得第一個(gè)任務(wù)的輸出成為第二個(gè)任務(wù)的輸入。

性能考慮和最佳實(shí)踐

來到了Guava異步編程的第7章,這里小黑要和大家聊聊性能考慮和最佳實(shí)踐。在使用Guava處理異步任務(wù)時(shí),性能是個(gè)不能忽視的重點(diǎn)。正確地使用Guava不僅能提高代碼的效率,還能避免一些常見的陷阱。

性能優(yōu)化建議

  • 合理配置線程池:在使用ListeningExecutorService時(shí),線程池的大小和類型是影響性能的關(guān)鍵因素。如果線程池太小,可能會(huì)導(dǎo)致任務(wù)排隊(duì),影響性能;反之,線程池太大,則可能浪費(fèi)資源。根據(jù)任務(wù)的類型(CPU密集型或IO密集型)和數(shù)量來合理配置線程池。
  • 避免不必要的阻塞:雖然future.get()可以獲取異步任務(wù)的結(jié)果,但它是阻塞的。在可能的情況下,使用非阻塞的方法,如回調(diào)或Futures.transform,這樣可以避免阻塞主線程,提高整體性能。
  • 減少上下文切換:過多的線程上下文切換會(huì)降低性能。如果異步任務(wù)非常短暫,考慮是否有必要使用異步,因?yàn)榫€程切換的開銷可能比任務(wù)執(zhí)行的時(shí)間還長。

Guava異步編程的最佳實(shí)踐

  • 清晰的錯(cuò)誤處理:在異步編程中,錯(cuò)誤處理很重要。使用Futures.catching等方法來清晰地處理異常,確保程序的健壯性。
  • 避免回調(diào)地獄:雖然回調(diào)是異步編程的一個(gè)重要部分,但過多的嵌套回調(diào)(回調(diào)地獄)會(huì)使代碼難以閱讀和維護(hù)。合理地組織代碼結(jié)構(gòu),盡可能使用鏈?zhǔn)秸{(diào)用來提高代碼的可讀性。
  • 異步任務(wù)的合理拆分:將大的異步任務(wù)拆分成更小的部分,這樣可以更靈活地管理任務(wù),也更容易處理錯(cuò)誤和異常。

通過遵循這些性能優(yōu)化建議和最佳實(shí)踐,咱們可以充分利用Guava的異步編程特性,編寫出既高效又易于維護(hù)的代碼。這樣,不僅提高了程序的性能,還使代碼更加優(yōu)雅和健壯。

實(shí)際案例分析

走到這一章,小黑想用一個(gè)實(shí)際案例來展示Guava異步編程的應(yīng)用。咱們知道,理論知識(shí)固然重要,但把知識(shí)應(yīng)用到實(shí)踐中去才能真正理解和掌握。這個(gè)案例將涉及Guava的幾個(gè)核心特性,包括異步任務(wù)的創(chuàng)建、處理回調(diào),以及異常管理。

案例背景

假設(shè)咱們正在開發(fā)一個(gè)電子商務(wù)應(yīng)用,需要從多個(gè)供應(yīng)商處獲取商品價(jià)格。這些查詢操作是獨(dú)立的,并且可能會(huì)耗時(shí),因此非常適合異步處理。

實(shí)現(xiàn)異步查詢

首先,咱們?yōu)槊總€(gè)供應(yīng)商創(chuàng)建一個(gè)異步任務(wù):

Callable<Double> task1 = () -> queryPriceFromSupplier1();
Callable<Double> task2 = () -> queryPriceFromSupplier2();
// 可以添加更多供應(yīng)商的任務(wù)

這里的queryPriceFromSupplier1queryPriceFromSupplier2是模擬查詢不同供應(yīng)商價(jià)格的方法。

接下來,使用Guava的ListeningExecutorService提交這些任務(wù),并將它們組合成一個(gè):

ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5));
List<ListenableFuture<Double>> priceFutures = Arrays.asList(
    service.submit(task1),
    service.submit(task2)
    // 添加更多的任務(wù)
);
ListenableFuture<List<Double>> allPrices = Futures.allAsList(priceFutures);

處理異步結(jié)果

現(xiàn)在,咱們需要處理這些異步任務(wù)的結(jié)果。使用Futures.addCallback來添加回調(diào)函數(shù),處理每個(gè)任務(wù)的結(jié)果:

Futures.addCallback(allPrices, new FutureCallback<List<Double>>() {
    @Override
    public void onSuccess(List<Double> prices) {
        // 處理成功,例如顯示價(jià)格或者計(jì)算平均值
        double averagePrice = calculateAverage(prices);
        System.out.println("平均價(jià)格: " + averagePrice);
    }
    @Override
    public void onFailure(Throwable thrown) {
        // 處理失敗,例如記錄日志或者通知用戶
        System.err.println("查詢價(jià)格失敗: " + thrown.getMessage());
    }
}, service);

在這個(gè)例子中,咱們在所有價(jià)格查詢完成后計(jì)算平均價(jià)格,并處理可能發(fā)生的異常。

總結(jié)

小黑和大家一起深入淺出地探討了Guava異步編程的諸多方面。從基礎(chǔ)的ListenableFutureListeningExecutorService的使用,到高級(jí)功能如回調(diào)、轉(zhuǎn)換、異常處理,再到性能考慮和最佳實(shí)踐,我們一步步揭開了Guava異步編程的神秘面紗。通過具體案例,我們也看到了Guava在實(shí)際開發(fā)中的應(yīng)用和優(yōu)勢。

在這個(gè)過程中,咱們學(xué)習(xí)了如何更高效地管理和操作異步任務(wù),如何優(yōu)雅地處理異常,以及如何提高代碼的清晰度和維護(hù)性。Guava的異步編程工具提供了強(qiáng)大的功能和靈活性,使得編寫復(fù)雜的異步邏輯變得更加簡單。

希望這些章節(jié)能幫助大家更好地理解和掌握Guava異步編程,讓咱們的Java開發(fā)之路更加順暢。記得,編程不僅僅是技術(shù)的積累,更是對知識(shí)的理解和應(yīng)用。

以上就是Java Guava異步編程實(shí)踐的詳細(xì)內(nèi)容,更多關(guān)于Java Guava異步編程的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java分代垃圾回收策略原理詳解

    Java分代垃圾回收策略原理詳解

    這篇文章主要介紹了Java分代垃圾回收策略原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java實(shí)現(xiàn)圖書管理系統(tǒng)的示例代碼

    Java實(shí)現(xiàn)圖書管理系統(tǒng)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用java語言實(shí)現(xiàn)簡單的圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Java之注解@Data和@ToString(callSuper=true)解讀

    Java之注解@Data和@ToString(callSuper=true)解讀

    在使用Lombok庫的@Data注解時(shí),若子類未通過@ToString(callSuper=true)注明包含父類屬性,toString()方法只打印子類屬性,解決方法:1. 子類重寫toString方法;2. 子類使用@Data和@ToString(callSuper=true),父類也應(yīng)使用@Data
    2024-11-11
  • Java中如何正確重寫equals方法

    Java中如何正確重寫equals方法

    Object類中equals方法比較的是兩個(gè)對象的引用地址,只有對象的引用地址指向同一個(gè)地址時(shí),才認(rèn)為這兩個(gè)地址是相等的,否則這兩個(gè)對象就不相等
    2021-10-10
  • spring mail借助qq郵箱服務(wù)器發(fā)送郵件

    spring mail借助qq郵箱服務(wù)器發(fā)送郵件

    這篇文章主要介紹了spring mail借助qq郵箱服務(wù)器發(fā)送郵件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Java并發(fā)編程之重入鎖與讀寫鎖

    Java并發(fā)編程之重入鎖與讀寫鎖

    這篇文章主要介紹了Java并發(fā)編程之重入鎖與讀寫鎖,文中相關(guān)實(shí)例代碼詳細(xì),測試可用,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • JDK14性能管理工具之Jconsole的使用詳解

    JDK14性能管理工具之Jconsole的使用詳解

    JConsole是JDK自帶的管理工具,在JAVA_HOME/bin下面,直接命令JConsole即可開啟JConsole。接下來通過本文給大家分享JDK14性能管理工具之Jconsole的使用,感興趣的朋友一起看看吧
    2020-05-05
  • 利用Java計(jì)算某個(gè)日期是星期幾

    利用Java計(jì)算某個(gè)日期是星期幾

    不知道大家有沒有遇到過同樣的問題,誰誰的生日又要到了,看看是星期幾?每年都要遇到好幾次,所以想索性利用Java寫個(gè)小工具,一次查詢某具體日期在n年中分別是星期幾。這樣不就方便了嗎?本文里給出了詳細(xì)的示例代碼,感興趣的朋友們下面來一起看看吧。
    2016-10-10
  • SpringBoot 2.x 整合Lombok的方法示例

    SpringBoot 2.x 整合Lombok的方法示例

    Spring Boot是非常高效的開發(fā)框架,lombok是一套代碼模板解決方案,將極大提升開發(fā)的效率,這篇文章主要介紹了SpringBoot 2.x 整合Lombok的方法示例,感興趣的小伙伴們可以參考一下
    2018-06-06
  • mybatis整合springboot報(bào)BindingException:Invalid?bound?statement?(not?found)異常解決

    mybatis整合springboot報(bào)BindingException:Invalid?bound?stateme

    這篇文章主要給大家介紹了關(guān)于mybatis整合springboot報(bào)BindingException:Invalid?bound?statement?(not?found)異常的解決辦法,這個(gè)錯(cuò)誤通常是由于Mapper文件中的statement?id與Java代碼中的方法名不一致導(dǎo)致的,需要的朋友可以參考下
    2024-01-01

最新評(píng)論