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

Java中「Future」接口詳解

這篇具有很好參考價值的文章主要介紹了Java中「Future」接口詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

目錄
  • 一、背景
  • 二、Future接口
    • 1、入門案例
    • 2、Future接口
  • 三、CompletableFuture類
    • 1、基礎(chǔ)說明
    • 2、核心方法
      • 2.1 實(shí)例方法
      • 2.2 計算方法
      • 2.3 結(jié)果獲取方法
      • 2.4 任務(wù)編排方法
      • 2.5 異常處理方法
    • 3、線程池問題
  • 四、CompletableFuture原理
    • 1、核心結(jié)構(gòu)
    • 2、零依賴
    • 3、一元依賴
    • 4、二元依賴
    • 5、多元依賴
  • 五、參考源碼

主打一手結(jié)果導(dǎo)向;

一、背景

在系統(tǒng)中,異步執(zhí)行任務(wù),是很常見的功能邏輯,但是在不同的場景中,又存在很多細(xì)節(jié)差異;

有的任務(wù)只強(qiáng)調(diào)「執(zhí)行過程」,并不需要追溯任務(wù)自身的「執(zhí)行結(jié)果」,這里并不是指對系統(tǒng)和業(yè)務(wù)產(chǎn)生的效果,比如定時任務(wù)、消息隊列等場景;

但是有些任務(wù)即強(qiáng)調(diào)「執(zhí)行過程」,又需要追溯任務(wù)自身的「執(zhí)行結(jié)果」,在流程中依賴某個異步結(jié)果,判斷流程是否中斷,比如「并行」處理;

串行處理】整個流程按照邏輯逐步推進(jìn),如果出現(xiàn)異常會導(dǎo)致流程中斷;

Java中「Future」接口詳解

并行處理】主流程按照邏輯逐步推進(jìn),其他「異步」交互的流程執(zhí)行完畢后,將結(jié)果返回到主流程,如果「異步」流程異常,會影響部分結(jié)果;

Java中「Future」接口詳解

此前在《「訂單」業(yè)務(wù)》的內(nèi)容中,聊過關(guān)于「串行」和「并行」的應(yīng)用對比,即在訂單詳情的加載過程中,通過「并行」的方式讀取:商品、商戶、訂單、用戶等信息,提升接口的響應(yīng)時間;

二、Future接口

1、入門案例

異步是對流程的解耦,但是有的流程中又依賴異步執(zhí)行的最終結(jié)果,此時就可以使用「Future」接口來達(dá)到該目的,先來看一個簡單的入門案例;

public class ServerTask implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        Thread.sleep(2000);
        return 3;
    }
}
public class FutureBase01 {
    public static void main(String[] args) throws Exception {
        TimeInterval timer = DateUtil.timer();
        // 線程池
        ExecutorService executor = Executors.newFixedThreadPool(3);
        // 批量任務(wù)
        List<ServerTask> serverTasks = new ArrayList<>() ;
        for (int i=0;i<3;i++){
            serverTasks.add(new ServerTask());
        }
        List<Future<Integer>> taskResList = executor.invokeAll(serverTasks) ;
        // 結(jié)果輸出
        for (Future<Integer> intFuture:taskResList){
            System.out.println(intFuture.get());
        }
        // 耗時統(tǒng)計
        System.out.println("timer...interval = "+timer.interval());
    }
}

這里模擬一個場景,以線程池批量執(zhí)行異步任務(wù),在任務(wù)內(nèi)線程休眠2秒,以并行的方式最終獲取全部結(jié)果,只耗時2秒多一點(diǎn),如果串行的話耗時肯定超過6秒;

2、Future接口

Future表示異步計算的結(jié)果,提供了用于檢查計算是否完成、等待計算完成、以及檢索計算結(jié)果的方法。

核心方法

  • get():等待任務(wù)完成,獲取執(zhí)行結(jié)果,如果任務(wù)取消會拋出異常;
  • get(long timeout, TimeUnit unit):指定等待任務(wù)完成的時間,等待超時會拋出異常;
  • isDone():判斷任務(wù)是否完成;
  • isCancelled():判斷任務(wù)是否被取消;
  • cancel(boolean mayInterruptIfRunning):嘗試取消此任務(wù)的執(zhí)行,如果任務(wù)已經(jīng)完成、已經(jīng)取消或由于其他原因無法取消,則此嘗試將失??;

基礎(chǔ)用法

public class FutureBase02 {
    public static void main(String[] args) throws Exception {
        // 線程池執(zhí)行任務(wù)
        ExecutorService executor = Executors.newFixedThreadPool(3);
        FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(3000);
                return "task...OK";
            }
        }) ;
        executor.execute(futureTask);
        // 任務(wù)信息獲取
        System.out.println("是否完成:"+futureTask.isDone());
        System.out.println("是否取消:"+futureTask.isCancelled());
        System.out.println("獲取結(jié)果:"+futureTask.get());
        System.out.println("嘗試取消:"+futureTask.cancel(Boolean.TRUE));
    }
}

FutureTask

Future接口的基本實(shí)現(xiàn)類,提供了計算的啟動和取消、查詢計算是否完成以及檢索計算結(jié)果的方法;

Java中「Future」接口詳解

在「FutureTask」類中,可以看到線程異步執(zhí)行任務(wù)時,其中的核心狀態(tài)轉(zhuǎn)換,以及最終結(jié)果寫出的方式;

雖然「Future」從設(shè)計上,實(shí)現(xiàn)了異步計算的結(jié)果獲取,但是通過上面的案例也可以發(fā)現(xiàn),流程的主線程在執(zhí)行get()方法時會阻塞,直到最終獲取結(jié)果,顯然對于程序來說并不友好;

JDK1.8提供「CompletableFuture」類,對「Future」進(jìn)行優(yōu)化和擴(kuò)展;

三、CompletableFuture類

1、基礎(chǔ)說明

「CompletableFuture」類提供函數(shù)編程的能力,可以通過回調(diào)的方式處理計算結(jié)果,并且支持組合操作,提供很多方法來實(shí)現(xiàn)異步編排,降低異步編程的復(fù)雜度;

Java中「Future」接口詳解

「CompletableFuture」實(shí)現(xiàn)「Future」和「CompletionStage」兩個接口;

  • Future:表示異步計算的結(jié)果;
  • CompletionStage:表示異步計算的一個步驟,當(dāng)一個階段計算完成時,可能會觸發(fā)其他階段,即步驟可能由其他CompletionStage觸發(fā);

入門案例

public class CompletableBase01 {
    public static void main(String[] args) throws Exception {
        // 線程池
        ExecutorService executor = Executors.newFixedThreadPool(3);
        // 任務(wù)執(zhí)行
        CompletableFuture<String> cft = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Res...OK";
        }, executor);
        // 結(jié)果輸出
        System.out.println(cft.get());
    }
}

2、核心方法

2.1 實(shí)例方法

public class Completable01 {
    public static void main(String[] args) throws Exception {
        // 線程池
        ExecutorService executor = Executors.newFixedThreadPool(3);

        // 1、創(chuàng)建未完成的CompletableFuture,通過complete()方法完成
        CompletableFuture<Integer> cft01 = new CompletableFuture<>() ;
        cft01.complete(99) ;

        // 2、創(chuàng)建已經(jīng)完成CompletableFuture,并且給定結(jié)果
        CompletableFuture<String> cft02 = CompletableFuture.completedFuture("given...value");

        // 3、有返回值,默認(rèn)ForkJoinPool線程池
        CompletableFuture<String> cft03 = CompletableFuture.supplyAsync(() -> {return "OK-3";});

        // 4、有返回值,采用Executor自定義線程池
        CompletableFuture<String> cft04 = CompletableFuture.supplyAsync(() -> {return "OK-4";},executor);

        // 5、無返回值,默認(rèn)ForkJoinPool線程池
        CompletableFuture<Void> cft05 = CompletableFuture.runAsync(() -> {});

        // 6、無返回值,采用Executor自定義線程池
        CompletableFuture<Void> cft06 = CompletableFuture.runAsync(()-> {}, executor);
    }
}

2.2 計算方法

public class Completable02 {
    public static void main(String[] args) throws Exception {
        // 線程池
        ExecutorService executor = Executors.newFixedThreadPool(3);
        CompletableFuture<String> cft01 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "OK";
        },executor);

        // 1、計算完成后,執(zhí)行后續(xù)處理
        // cft01.whenComplete((res, ex) -> System.out.println("Result:"+res+";Exe:"+ex));

        // 2、觸發(fā)計算,如果沒有完成,則get設(shè)定的值,如果已完成,則get任務(wù)返回值
        // boolean completeFlag = cft01.complete("given...value");
        // if (completeFlag){
        //     System.out.println(cft01.get());
        // } else {
        //     System.out.println(cft01.get());
        // }

        // 3、開啟新CompletionStage,重新獲取線程執(zhí)行任務(wù)
        cft01.whenCompleteAsync((res, ex) -> System.out.println("Result:"+res+";Exe:"+ex),executor);
    }
}

2.3 結(jié)果獲取方法

public class Completable03 {
    public static void main(String[] args) throws Exception {
        // 線程池
        ExecutorService executor = Executors.newFixedThreadPool(3);
        CompletableFuture<String> cft01 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Res...OK";
        },executor);
        // 1、阻塞直到獲取結(jié)果
        // System.out.println(cft01.get());

        // 2、設(shè)定超時的阻塞獲取結(jié)果
        // System.out.println(cft01.get(4, TimeUnit.SECONDS));

        // 3、非阻塞獲取結(jié)果,如果任務(wù)已經(jīng)完成,則返回結(jié)果,如果任務(wù)未完成,返回給定的值
        // System.out.println(cft01.getNow("given...value"));

        // 4、get獲取拋檢查異常,join獲取非檢查異常
        System.out.println(cft01.join());
    }
}

2.4 任務(wù)編排方法

public class Completable04 {
    public static void main(String[] args) throws Exception {
        // 線程池
        ExecutorService executor = Executors.newFixedThreadPool(3);
        CompletableFuture<String> cft01 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("OK-1");
            return "OK";
        },executor);

        // 1、cft01任務(wù)執(zhí)行完成后,執(zhí)行之后的任務(wù),此處不關(guān)注cft01的結(jié)果
        // cft01.thenRun(() -> System.out.println("task...run")) ;

        // 2、cft01任務(wù)執(zhí)行完成后,執(zhí)行之后的任務(wù),可以獲取cft01的結(jié)果
        // cft01.thenAccept((res) -> {
        //     System.out.println("cft01:"+res);
        //     System.out.println("task...run");
        // });

        // 3、cft01任務(wù)執(zhí)行完成后,執(zhí)行之后的任務(wù),獲取cft01的結(jié)果,并且具有返回值
        // CompletableFuture<Integer> cft02 = cft01.thenApply((res) -> {
        //     System.out.println("cft01:"+res);
        //     return 99 ;
        // });
        // System.out.println(cft02.get());

        // 4、順序執(zhí)行cft01、cft02
        // CompletableFuture<String> cft02 = cft01.thenCompose((res) ->  CompletableFuture.supplyAsync(() -> {
        //     System.out.println("cft01:"+res);
        //     return "OK-2";
        // }));
        // cft02.whenComplete((res,ex) -> System.out.println("Result:"+res+";Exe:"+ex));

        // 5、對比任務(wù)的執(zhí)行效率,由于cft02先完成,所以取cft02的結(jié)果
        // CompletableFuture<String> cft02 = cft01.applyToEither(CompletableFuture.supplyAsync(() -> {
        //     System.out.println("run...cft02");
        //     try {
        //         Thread.sleep(3000);
        //     } catch (InterruptedException e) {
        //         e.printStackTrace();
        //     }
        //     return "OK-2";
        // }),(res) -> {
        //     System.out.println("either...result:" + res);
        //     return res;
        // });
        // System.out.println("finally...result:" + cft02.get());

        // 6、兩組任務(wù)執(zhí)行完成后,對結(jié)果進(jìn)行合并
        // CompletableFuture<String> cft02 = CompletableFuture.supplyAsync(() -> "OK-2") ;
        // String finallyRes = cft01.thenCombine(cft02,(res1,res2) -> {
        //     System.out.println("res1:"+res1+";res2:"+res2);
        //     return res1+";"+res2 ;
        // }).get();
        // System.out.println(finallyRes);


        CompletableFuture<String> cft02 = CompletableFuture.supplyAsync(() -> {
            System.out.println("OK-2");
            return  "OK-2";
        }) ;
        CompletableFuture<String> cft03 = CompletableFuture.supplyAsync(() -> {
            System.out.println("OK-3");
            return "OK-3";
        }) ;
        // 7、等待批量任務(wù)執(zhí)行完返回
        // CompletableFuture.allOf(cft01,cft02,cft03).get();

        // 8、任意一個任務(wù)執(zhí)行完即返回
        System.out.println("Sign:"+CompletableFuture.anyOf(cft01,cft02,cft03).get());
    }
}

2.5 異常處理方法

public class Completable05 {
    public static void main(String[] args) throws Exception {
        // 線程池
        ExecutorService executor = Executors.newFixedThreadPool(3);
        CompletableFuture<String> cft01 = CompletableFuture.supplyAsync(() -> {
            if (1 > 0){
                throw new RuntimeException("task...exception");
            }
            return "OK";
        },executor);

        // 1、捕獲cft01的異常信息,并提供返回值
        String finallyRes = cft01.thenApply((res) -> {
            System.out.println("cft01-res:" + res);
            return res;
        }).exceptionally((ex) -> {
            System.out.println("cft01-exe:" + ex.getMessage());
            return "error" ;
        }).get();
        System.out.println("finallyRes="+finallyRes);


        CompletableFuture<String> cft02 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "OK-2";
        },executor);
        // 2、如果cft02未完成,則get時拋出指定異常信息
        boolean exeFlag = cft02.completeExceptionally(new RuntimeException("given...exception"));
        if (exeFlag){
            System.out.println(cft02.get());
        } else {
            System.out.println(cft02.get());
        }
    }
}

3、線程池問題

  • 在實(shí)踐中,通常不使用ForkJoinPool#commonPool()公共線程池,會出現(xiàn)線程競爭問題,從而形成系統(tǒng)瓶頸;
  • 在任務(wù)編排中,如果出現(xiàn)依賴情況或者父子任務(wù),盡量使用多個線程池,從而避免任務(wù)請求同一個線程池,規(guī)避死鎖情況發(fā)生;

四、CompletableFuture原理

1、核心結(jié)構(gòu)

在分析「CompletableFuture」其原理之前,首先看一下涉及的核心結(jié)構(gòu);

Java中「Future」接口詳解

CompletableFuture

在該類中有兩個關(guān)鍵的字段:「result」存儲當(dāng)前CF的結(jié)果,「stack」代表棧頂元素,即當(dāng)前CF計算完成后會觸發(fā)的依賴動作;從上面案例中可知,依賴動作可以沒有或者有多個;

Completion

依賴動作的封裝類;

UniCompletion

繼承Completion類,一元依賴的基礎(chǔ)類,「executor」指線程池,「dep」指依賴的計算,「src」指源動作;

BiCompletion

繼承UniCompletion類,二元或者多元依賴的基礎(chǔ)類,「snd」指第二個源動作;

2、零依賴

顧名思義,即各個CF之間不產(chǎn)生依賴關(guān)系;

public class DepZero {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newFixedThreadPool(3);
        CompletableFuture<String> cft1 = CompletableFuture.supplyAsync(()-> "OK-1",executor);
        CompletableFuture<String> cft2 = CompletableFuture.supplyAsync(()-> "OK-2",executor);
        System.out.println(cft1.get()+";"+cft2.get());
    }
}

3、一元依賴

即CF之間的單個依賴關(guān)系;這里使用「thenApply」方法演示,為了看到效果,使「cft1」長時間休眠,斷點(diǎn)查看「stack」結(jié)構(gòu);

public class DepOne {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newFixedThreadPool(3);
        CompletableFuture<String> cft1 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "OK-1";
        },executor);

        CompletableFuture<String> cft2 = cft1.thenApply(res -> {
            System.out.println("cft01-res"+res);
            return "OK-2" ;
        });
        System.out.println("cft02-res"+cft2.get());
    }
}

斷點(diǎn)截圖

Java中「Future」接口詳解

原理分析

Java中「Future」接口詳解

觀察者Completion注冊到「cft1」,注冊時會檢查計算是否完成,未完成則觀察者入棧,當(dāng)「cft1」計算完成會彈棧;已完成則直接觸發(fā)觀察者;

可以調(diào)整斷點(diǎn)代碼,讓「cft1」先處于完成狀態(tài),再查看其運(yùn)行時結(jié)構(gòu),從而分析完整的邏輯;

4、二元依賴

即一個CF同時依賴兩個CF;這里使用「thenCombine」方法演示;為了看到效果,使「cft1、cft2」長時間休眠,斷點(diǎn)查看「stack」結(jié)構(gòu);

public class DepTwo {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newFixedThreadPool(3);
        CompletableFuture<String> cft1 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "OK-1";
        },executor);
        CompletableFuture<String> cft2 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "OK-2";
        },executor);

        // cft3 依賴 cft1和cft2 的計算結(jié)果
        CompletableFuture<String> cft3 = cft1.thenCombine(cft2,(res1,res2) -> {
            System.out.println("cft01-res:"+res1);
            System.out.println("cft02-res:"+res2);
            return "OK-3" ;
        });
        System.out.println("cft03-res:"+cft3.get());
    }
}

斷點(diǎn)截圖

Java中「Future」接口詳解

原理分析

Java中「Future」接口詳解

在「cft1」和「cft2」未完成的狀態(tài)下,嘗試將BiApply壓入「cft1」和「cft2」兩個棧中,任意CF完成時,會嘗試觸發(fā)觀察者,觀察者檢查「cft1」和「cft2」是否都完成,如果完成則執(zhí)行;

5、多元依賴

即一個CF同時依賴多個CF;這里使用「allOf」方法演示;為了看到效果,使「cft1、cft2、cft3」長時間休眠,斷點(diǎn)查看「stack」結(jié)構(gòu);

public class DepMore {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newFixedThreadPool(3);
        CompletableFuture<String> cft1 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "OK-1";
        },executor);
        CompletableFuture<String> cft2 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "OK-2";
        },executor);

        CompletableFuture<String> cft3 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "OK-3";
        },executor);

        // cft4 依賴 cft1和cft2和cft3 的計算結(jié)果
        CompletableFuture<Void> cft4 = CompletableFuture.allOf(cft1,cft2,cft3);
        CompletableFuture<String> finallyRes = cft4.thenApply(tm -> {
            System.out.println("cft01-res:"+cft1.join());
            System.out.println("cft02-res:"+cft2.join());
            System.out.println("cft03-res:"+cft3.join());
            return "OK-4";
        });
        System.out.println("finally-res:"+finallyRes.get());
    }
}

斷點(diǎn)截圖

Java中「Future」接口詳解

原理分析

Java中「Future」接口詳解

多元依賴的回調(diào)方法除了「allOf」還有「anyOf」,其實(shí)現(xiàn)原理都是將依賴的多個CF補(bǔ)全為平衡二叉樹,從斷點(diǎn)圖可知會按照樹的層級處理,核心結(jié)構(gòu)參考二元依賴即可;文章來源地址http://www.zghlxwxcb.cn/news/detail-416106.html

五、參考源碼

編程文檔:
https://gitee.com/cicadasmile/butte-java-note

應(yīng)用倉庫:
https://gitee.com/cicadasmile/butte-flyer-parent

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

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 多線程系列(十九) -Future使用詳解

    多線程系列(十九) -Future使用詳解

    在前幾篇線程系列文章中,我們介紹了線程池的相關(guān)技術(shù),任務(wù)執(zhí)行類只需要實(shí)現(xiàn) Runnable 接口,然后交給線程池,就可以輕松的實(shí)現(xiàn)異步執(zhí)行多個任務(wù)的目標(biāo),提升程序的執(zhí)行效率,比如如下異步執(zhí)行任務(wù)下載。 而實(shí)際上 Runnable 接口并不能滿足所有的需求,比如有些場景下

    2024年03月14日
    瀏覽(40)
  • Linux rm命令詳解,Linux刪除文件目錄(非常詳細(xì))從零基礎(chǔ)入門到精通,看完這一篇就夠了。

    Linux rm命令詳解,Linux刪除文件目錄(非常詳細(xì))從零基礎(chǔ)入門到精通,看完這一篇就夠了。

    一、常用操作 1. 刪除文件 2. 刪除目錄 二、其他操作 作用:刪除文件或目錄 參數(shù): -f 直接刪除,不需要確認(rèn)。 -r 遞歸刪除(用來刪除目錄) -i 刪除前逐一詢問。 -v 顯示步驟 -d 只刪除空目錄 1)rm 后面直接跟文件名,可以刪除文件,刪除前會詢問是否刪除(y確認(rèn),n取消)

    2024年02月06日
    瀏覽(20)
  • Java并發(fā)編程:Callable、Future和FutureTask

    在前面的文章中我們講述了創(chuàng)建線程的 2 種方式,一種是直接繼承 Thread ,另外一種就是實(shí)現(xiàn) Runnable 接口。 這 2 種方式都有一個缺陷就是:在執(zhí)行完任務(wù)之后無法獲取執(zhí)行結(jié)果。 如果需要獲取執(zhí)行結(jié)果,就必須通過共享變量或者使用線程通信的方式來達(dá)到效果,這樣使用起

    2024年02月13日
    瀏覽(25)
  • 【Java并發(fā)】聊聊Future如何提升商品查詢速度

    【Java并發(fā)】聊聊Future如何提升商品查詢速度

    java中可以通過new thread、實(shí)現(xiàn)runnable來進(jìn)行實(shí)現(xiàn)線程。但是唯一的缺點(diǎn)是沒有返回值、以及拋出異常,而callable就可以解決這個問題。通過配合使用futuretask來進(jìn)行使用。 并且Future提供了對任務(wù)的操作,取消,查詢是否完成,獲取結(jié)果。 FutureTask核心代碼 基本屬性 任務(wù) 當(dāng)線程

    2024年01月25日
    瀏覽(16)
  • Java入門教程||Java 封裝||Java 接口

    在面向?qū)ο蟪淌皆O(shè)計方法中,封裝(英語:Encapsulation)是指,一種將抽象性函式接口的實(shí)作細(xì)節(jié)部份包裝、隱藏起來的方法。? 封裝可以被認(rèn)為是一個保護(hù)屏障,防止該類的代碼和數(shù)據(jù)被外部類定義的代碼隨機(jī)訪問。 要訪問該類的代碼和數(shù)據(jù),必須通過嚴(yán)格的接口控制。 封

    2024年02月02日
    瀏覽(37)
  • 從 Future 到 CompletableFuture:簡化 Java 中的異步編程

    在并發(fā)編程中,我們經(jīng)常需要處理多線程的任務(wù),這些任務(wù)往往具有依賴性,異步性,且需要在所有任務(wù)完成后獲取結(jié)果。Java 8 引入了 CompletableFuture 類,它帶來了一種新的編程模式,讓我們能夠以函數(shù)式編程的方式處理并發(fā)任務(wù),顯著提升了代碼的可讀性和簡潔性。 在這篇

    2024年02月11日
    瀏覽(20)
  • Java接口詳解

    Java接口詳解

    在現(xiàn)實(shí)生活中,接口的例子比比皆是,比如:筆記本上的USB口,電源插座等。 電腦的USB口上,可以插:U盤,鼠標(biāo),鍵盤等所有符合USB協(xié)議的設(shè)備 電源插座插孔上,可以插:電腦,電視機(jī),電飯煲等所有符合規(guī)范的設(shè)備 通過上述例子可以看出: 接口就是公共行為的規(guī)范標(biāo)準(zhǔn)

    2024年02月11日
    瀏覽(8)
  • java 接口 詳解

    java 接口 詳解

    目錄 一、概述 ? ? ? ? 1.介紹 :? ? ? ? ? 2.定義 :? 二、特點(diǎn)? ? ? ? ? 1.接口成員變量的特點(diǎn) :? ? ? ? ? 2.接口成員方法的特點(diǎn) : ? ? ? ? 3.接口構(gòu)造方法的特點(diǎn) :? ? ? ? ? 4.接口創(chuàng)建對象的特點(diǎn) :? ? ? ? ? 5.接口繼承關(guān)系的特點(diǎn) :? 三、應(yīng)用 :? ? ? ? ? 1.情景 :? ? ?

    2024年02月05日
    瀏覽(15)
  • Java之接口的詳解

    我們已經(jīng)學(xué)完了抽象類,抽象類中可以用抽象方法,也可以有普通方法,構(gòu)造方法,成員變量等。那么什么是接口呢? 接口是更加徹底的抽象,JDK7之前,包括JDK7,接口中全部是抽象方法。接口同樣是不能創(chuàng)建對象的 。 在JDK7,包括JDK7之前,接口中的 只有 包含:抽象方法和

    2024年02月11日
    瀏覽(13)
  • CSS3屬性詳解(一)文本 盒模型中的 box-ssize 屬性 處理兼容性問題:私有前綴 邊框 背景屬性 漸變 前端開發(fā)入門筆記(七)

    CSS3屬性詳解(一)文本 盒模型中的 box-ssize 屬性 處理兼容性問題:私有前綴 邊框 背景屬性 漸變 前端開發(fā)入門筆記(七)

    CSS3是用于為HTML文檔添加樣式和布局的最新版本的層疊樣式表 (Cascading Style Sheets)。下面是一些常用的CSS3屬性及其詳細(xì)解釋: border-radius:設(shè)置元素的邊框圓角的半徑??梢允褂盟膫€值設(shè)置四個不同的圓角半徑,也可以只使用一個值來設(shè)置統(tǒng)一的圓角。 box-shadow:創(chuàng)建一個元

    2024年02月08日
    瀏覽(30)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包