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

Java使用Runnable和Callable實現(xiàn)多線程的區(qū)別詳解

 更新時間:2022年07月07日 11:39:19   作者:知識焦慮癥患者  
這篇文章主要為大家詳細(xì)介紹了Java使用Runnable和Callable實現(xiàn)多線程的區(qū)別之處,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下

使用Runnable和Callable接口實現(xiàn)多線程的區(qū)別

先看兩種實現(xiàn)方式的步驟:

1.實現(xiàn)Runnable接口

public class ThreadDemo{
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
             //創(chuàng)建并啟動由實現(xiàn)Runnable接口創(chuàng)建的線程
            new Thread(new Runner(),"Thread"+i).start();
        }
    }
}

//實現(xiàn)Runnable接口
class Runner implements Runnable{
    //實現(xiàn)run方法
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"有實現(xiàn)Runnable接口創(chuàng)建");
    }
}

2.實現(xiàn) Callable 接口

public class ThreadDemo{
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        for (int i = 1; i <= 5; i++) {
            //使用FutureTask保存線程結(jié)果
            FutureTask<String> futureTask = new FutureTask<String>(new Caller());
            //創(chuàng)建并啟動由實現(xiàn)Callable創(chuàng)建的線程
            new Thread(futureTask,"Thread"+i).start();
            //獲取線程執(zhí)行結(jié)果
            System.out.println(futureTask.get());
        }
    }
}

//實現(xiàn)Callable接口
class Caller implements Callable{
    //實現(xiàn)Call接口
    @Override
    public Object call() throws Exception {
        String result = Thread.currentThread().getName()+"由實現(xiàn)Callable接口創(chuàng)建";
        return result;
    }
}

從以上代碼可以看出,使用 Callable 接口創(chuàng)建多線程時使用了 FutureTask 進(jìn)行封裝,然后 FutureTask 作為參數(shù)傳給 Thread 的構(gòu)造函數(shù),而 FutureTask 的作用是存放 Callable 接口 call 方法的返回值。我們來看一下 FutureTask 的源碼

//FutureTask實現(xiàn)了RunnableFuture接口
public class FutureTask<V> implements RunnableFuture<V> {}

//再看RunnableFuture接口,繼承了Runnable接口
public interface RunnableFuture<V> extends Runnable, Future<V> {
    void run();
}

//回到FutureTask,找到run方法
public void run() {
    ...
    Callable<V> c = callable;
    if (c != null && state == NEW) {
        V result;
        boolean ran;
        try {
            //獲取call的返回值
            result = c.call();
            ran = true;
        } catch (Throwable ex) {
            result = null;
            ran = false;
            setException(ex);
        }
        if (ran)
            set(result);
    }
    ...
}

//看一下set方法
protected void set(V v) {
    if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {
        outcome = v;
        ...
    }
}

//再看一下FutureTask的構(gòu)造函數(shù)
public FutureTask(Callable<V> callable) {
        if (callable == null)
            throw new NullPointerException();
        this.callable = callable;
        this.state = NEW;
}

從對 FutureTask 的源碼分析,我們可以看出 FutureTask 實現(xiàn)了 Runnable 接口的 run 方法,在 run 方法中調(diào)用了 Callable 的 call 方法,將結(jié)果保存到 result 中,通過 set 方法將結(jié)果存儲至 outcome 變量中。

通過以上分析,我們總結(jié)出使用 Runnable 和 Callable 接口的區(qū)別:

1.使用 Runnable 接口實現(xiàn)更加簡單,而 通過 Callable 接口創(chuàng)建線程需要 FutureTask 進(jìn)行封裝;

2.通過實現(xiàn) Runnable 接口創(chuàng)建的線程沒有返回值,而使用 Callable 接口創(chuàng)建的線程可以有返回結(jié)果,并保存在 FutureTask中;

3.通過實現(xiàn) Runnable 接口創(chuàng)建線程不拋出異常,而使用 Callable 接口創(chuàng)建的線程會拋出異常;

從以上總結(jié)可以看出,我們也可以看出 Runnable 適用于無需返回值的場景,而 Callable 接口用于需要保存返回值的場景。

到此這篇關(guān)于Java使用Runnable和Callable實現(xiàn)多線程的區(qū)別詳解的文章就介紹到這了,更多相關(guān)Java Runnable Callable多線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何在Spring?Boot中使用MyBatis訪問數(shù)據(jù)庫

    如何在Spring?Boot中使用MyBatis訪問數(shù)據(jù)庫

    MyBatis可以通過簡單的XML或者注解來配置和映射原始類型,接口,和Java POJO為數(shù)據(jù)庫中記錄,使用MyBatis幫助我們解決各種問題,本文介紹如何在Spring?Boot中使用MyBatis訪問數(shù)據(jù)庫,感興趣的朋友一起看看吧
    2023-11-11
  • Java異常類型介紹及處理方法

    Java異常類型介紹及處理方法

    這篇文章介紹了Java異常類型介紹及處理方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 簡單聊一聊Java線程池ThreadPoolExecutor

    簡單聊一聊Java線程池ThreadPoolExecutor

    在使用線程池之后,開啟線程就變成了在線程池當(dāng)中找到一個空閑的線程,銷毀線程變成了歸還線程到線程池的過程,下面這篇文章主要給大家介紹了關(guān)于Java線程池ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Springboot使用redisson?+?自定義注解實現(xiàn)消息的發(fā)布訂閱(解決方案)

    Springboot使用redisson?+?自定義注解實現(xiàn)消息的發(fā)布訂閱(解決方案)

    Redisson是一個基于Redis的Java駐留內(nèi)存數(shù)據(jù)網(wǎng)格(In-Memory?Data?Grid)和分布式鎖框架,它提供了一系列的分布式Java對象和服務(wù),可以幫助開發(fā)者更方便地使用Redis作為數(shù)據(jù)存儲和分布式鎖的解決方案,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • java中的常用集合類整理

    java中的常用集合類整理

    本篇文章給大家?guī)淼膬?nèi)容是關(guān)于java中List集合及其實現(xiàn)類的方法介紹(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。下面我們就來學(xué)習(xí)一下吧,希望能給你帶來幫助
    2021-06-06
  • springboot實現(xiàn)rabbitmq消息確認(rèn)的示例代碼

    springboot實現(xiàn)rabbitmq消息確認(rèn)的示例代碼

    RabbitMQ的消息確認(rèn)有兩種, 一種是消息發(fā)送確認(rèn),第二種是消費(fèi)接收確認(rèn),本文主要介紹了springboot實現(xiàn)rabbitmq消息確認(rèn)的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • SpringBoot中的@Import注解四種使用方式詳解

    SpringBoot中的@Import注解四種使用方式詳解

    這篇文章主要介紹了SpringBoot中的@Import注解四種使用方式詳解,@Import注解只可以標(biāo)注在類上,可以結(jié)合 @Configuration注解、ImportSelector、ImportBeanDefinitionRegistrar一起使用,也可以導(dǎo)入普通的類,需要的朋友可以參考下
    2023-12-12
  • 深入剖析Java中的各種異常處理方式

    深入剖析Java中的各種異常處理方式

    這篇文章主要介紹了深入剖析Java中的各種異常處理方式,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-07-07
  • 解決Netty解碼http請求獲取URL亂碼問題

    解決Netty解碼http請求獲取URL亂碼問題

    這篇文章主要介紹了解決Netty解碼http請求獲取URL亂碼問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 帶你輕松了解Modbus協(xié)議

    帶你輕松了解Modbus協(xié)議

    這篇文章主要給大家介紹了關(guān)于Modbus協(xié)議的相關(guān)資料,此協(xié)議定義了一個控制器能認(rèn)識使用的消息結(jié)構(gòu),而不管它們是經(jīng)過何種網(wǎng)絡(luò)進(jìn)行通信的,需要的朋友可以參考下
    2021-11-11

最新評論

沅江市| 宝山区| 锦州市| 聊城市| 左贡县| 贵州省| 玉树县| 海原县| 鹿邑县| 墨江| 乌鲁木齐县| 防城港市| 镇康县| 昆山市| 武鸣县| 鹤岗市| 郴州市| 芜湖县| 井陉县| 静安区| 米林县| 合阳县| 三都| 文登市| 普安县| 安仁县| 天峨县| 陇川县| 甘孜县| 于都县| 白城市| 延津县| 新竹县| 旌德县| 福鼎市| 峨眉山市| 隆回县| 蕉岭县| 遂川县| 成都市| 双峰县|