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

Java并發(fā)工具類Future使用示例

 更新時間:2022年06月03日 17:17:28   作者:碼拉松  
這篇文章主要介紹了Java并發(fā)工具類Future使用示例,本文需要注意future.get()方法是阻塞式的,如果調(diào)用該方法的時候任務(wù)尚未執(zhí)行完成,則會一直等待下去,直到任務(wù)執(zhí)行結(jié)束,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧

前言

Future是一個接口類,定義了5個方法:

boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;

通過這5個方法可以看出,F(xiàn)uture不但可以獲取提交任務(wù)的執(zhí)行結(jié)果,甚至還可以取消任務(wù)。

Future使用示例

摘自JDK中Future示例代碼

class ArchiveSearcherImpl implements ArchiveSearcher{

    @Override
    public String search(String target) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return target;
    }
}

interface ArchiveSearcher {
    String search(String target);
}

class App {

    public static void main(String[] args) throws InterruptedException {
        App app = new App();
        app.showSearch("search");
    }

    ExecutorService executor = Executors.newSingleThreadExecutor();
    ArchiveSearcher searcher = new ArchiveSearcherImpl();

    void showSearch(final String target)
            throws InterruptedException {
        // 提交任務(wù)
        Future<String> future
                = executor.submit(new Callable<String>() {
            public String call() {
                return searcher.search(target);
            }
        });
        displayOtherThings(); // do other things while searching
        try {
        	// 拿任務(wù)執(zhí)行結(jié)果
            displayText(future.get()); // use future
        } catch (ExecutionException ex) {
            //cleanup();
            return;
        }
    }
    private void displayOtherThings() {
        System.out.println("do other things");
    }

    private void displayText(String s) {
        System.out.println(s);
    }
}

注意:future.get()方法是阻塞式的,如果調(diào)用該方法的時候任務(wù)尚未執(zhí)行完成,則會一直等待下去,直到任務(wù)執(zhí)行結(jié)束。

ExecutorService還有一個sumbit方法比較特殊:<T> Future<T> submit(Runnable task, T result);這個方法可以先把result這個參數(shù)傳給task使用,然后再通過get方法把result返回。

public class FutureTest {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executor = Executors.newSingleThreadExecutor();

        MyResult myResult = new MyResult();
        MyTask myTask = new MyTask(myResult);
		
		// 提交任務(wù)后,在任務(wù)中操作myResult
        Future<MyResult> future = executor.submit(myTask, myResult);
        // 最后get方法可以拿到myResult
        System.out.println(future.get());
    }

}


class MyTask implements Runnable {

    private MyResult myResult;

    public MyTask(MyResult myResult) {
        this.myResult = myResult;
    }

    @Override
    public void run() {
        myResult.setCode("10000");
    }
}

@Data
@ToString
class MyResult {
    private String code;
}

FutureTask

FutureTask是一個實現(xiàn)了Runnable和Future接口的工具類,結(jié)合了這兩個接口的能力,F(xiàn)utureTask即可以提交給線程任務(wù)執(zhí)行,又可以獲取到執(zhí)行結(jié)果。

具體代碼示例:

import java.util.concurrent.*;

public class FutureTaskTest {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> futureTask1 = new FutureTask<>(new MyTask1());
        FutureTask<String> futureTask2 = new FutureTask<>(new MyTask2());

        ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.submit(futureTask1);
        executorService.submit(futureTask2);

        long start = System.currentTimeMillis();
        System.out.println(futureTask1.get());
        System.out.println(futureTask2.get());
        long end = System.currentTimeMillis();

        System.out.println(end - start);
    }

}

class MyTask2 implements Callable<String> {

    @Override
    public String call() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "MyTask2 over";
    }
}

class MyTask1 implements Callable<String> {

    @Override
    public String call() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "MyTask1 over";
    }
}

到此這篇關(guān)于Java并發(fā)工具類Future使用示例的文章就介紹到這了,更多相關(guān)Java并發(fā)工具類Future內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談java中HashMap鍵的比較方式

    淺談java中HashMap鍵的比較方式

    今天帶大家了解一下java中HashMap鍵的比較方式,文中有非常詳細(xì)的解釋說明及代碼示例,對正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • 詳解Spring DeferredResult異步操作使用場景

    詳解Spring DeferredResult異步操作使用場景

    本文主要介紹了Spring DeferredResult異步操作使用場景,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Spring?MVC中JSON數(shù)據(jù)處理方式實戰(zhàn)案例

    Spring?MVC中JSON數(shù)據(jù)處理方式實戰(zhàn)案例

    Spring MVC是個靈活的框架,返回JSON數(shù)據(jù)的也有很多五花八門的方式,下面這篇文章主要給大家介紹了關(guān)于Spring?MVC中JSON數(shù)據(jù)處理方式的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Java基礎(chǔ)之淺談hashCode()和equals()

    Java基礎(chǔ)之淺談hashCode()和equals()

    今天給大家?guī)淼氖顷P(guān)于Java基礎(chǔ)的相關(guān)知識,文章圍繞著hashCode()和equals()展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 聊聊Spring Cloud Cli 初體驗

    聊聊Spring Cloud Cli 初體驗

    這篇文章主要介紹了聊聊Spring Cloud Cli 初體驗,SpringBoot CLI 是spring Boot項目的腳手架工具。非常具有實用價值,需要的朋友可以參考下
    2018-04-04
  • Java 之類型轉(zhuǎn)換與多態(tài)詳情

    Java 之類型轉(zhuǎn)換與多態(tài)詳情

    Java使用類創(chuàng)造新的類型(type),并使用繼承來便利我們創(chuàng)建類。再深一層講類型,并是多態(tài)(polymorphism)的概念。本文將給大家介紹Java 的類型轉(zhuǎn)換與多態(tài),需要的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • Java多線程編程中的線程死鎖的問題解決

    Java多線程編程中的線程死鎖的問題解決

    線程死鎖是多線程編程中的一個常見問題,它發(fā)生在多個線程互相等待對方釋放資源的情況下,導(dǎo)致程序無法繼續(xù)執(zhí)行,本文就來介紹一下Java多線程編程中的線程死鎖的問題解決,感興趣的可以了解一下
    2023-08-08
  • Java?8函數(shù)式接口之BinaryOperator使用示例詳解

    Java?8函數(shù)式接口之BinaryOperator使用示例詳解

    這篇文章主要大家介紹了Java?8函數(shù)式接口之BinaryOperator,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Dubbo異步調(diào)用的實現(xiàn)介紹

    Dubbo異步調(diào)用的實現(xiàn)介紹

    dubbo默認(rèn)使用同步的方式調(diào)用。但在有些特殊的場景下,我們可能希望異步調(diào)用dubbo接口,從而避免不必要的等待時間,這時候我們就需要用到異步。那么dubbo的異步是如何實現(xiàn)的呢?下面就來看看這個問題
    2022-09-09
  • Spring Boot 直接用jar運(yùn)行項目的方法

    Spring Boot 直接用jar運(yùn)行項目的方法

    這篇文章主要介紹了Spring Boot 直接用jar運(yùn)行項目的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下
    2018-02-02

最新評論