亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文帶你搞懂Java中線程的創(chuàng)建方式

 更新時(shí)間:2023年03月06日 09:43:17   作者:半夏之沫  
這篇文章主要為大家詳細(xì)介紹了Java中線程的創(chuàng)建方式的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下

一. 繼承Thread

可以通過創(chuàng)建Thread的子類并在子類中重寫run() 方法完成線程創(chuàng)建。示例如下所示。

public class ThreadTest {

    @Test
    public void 繼承Thread() throws Exception {
        // 創(chuàng)建線程對(duì)象
        MyThread myThread = new MyThread();

        // 啟動(dòng)線程
        myThread.start();

        // 睡1秒,等待子線程執(zhí)行完任務(wù)
        Thread.sleep(1000);
    }

    private static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("線程執(zhí)行了");
        }
    }

}

運(yùn)行測(cè)試程序,打印如下。

其實(shí)可以只繼承Thread,而不重寫run() 方法,此時(shí)是不會(huì)報(bào)錯(cuò)的,只不過調(diào)用start() 方法后線程不會(huì)執(zhí)行任何邏輯。示例如下。

public class ThreadTest {

    @Test
    public void 繼承Thread時(shí)可以不重寫run方法() {
        // 創(chuàng)建沒有重寫run()方法的線程對(duì)象
        MyThreadNotOverrideRun myThread = new MyThreadNotOverrideRun();

        // 啟動(dòng)線程,不報(bào)錯(cuò),執(zhí)行的是Thread的run()方法,無任何邏輯
        myThread.start();
    }

    private static class MyThreadNotOverrideRun extends Thread {}

}

二. 創(chuàng)建Runnable對(duì)象

可以通過創(chuàng)建Runnable接口的實(shí)現(xiàn)類,然后將Runnable對(duì)象作為Thread對(duì)象的執(zhí)行任務(wù),來創(chuàng)建線程。示例如下。

public class ThreadTest {

    @Test
    public void 基于Runnable() throws Exception {
        // 創(chuàng)建Runnable任務(wù)對(duì)象
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("任務(wù)執(zhí)行");
            }
        };

        // 創(chuàng)建Thread對(duì)象時(shí)將Runnable任務(wù)對(duì)象通過構(gòu)造函數(shù)傳入
        Thread thread = new Thread(runnable);

        // 啟動(dòng)線程
        thread.start();

        // 睡1秒,等待子線程執(zhí)行完任務(wù)
        Thread.sleep(1000);
    }

}

運(yùn)行測(cè)試程序,執(zhí)行結(jié)果如下所示。

三. 創(chuàng)建Callable對(duì)象

Callable接口也是可以作為任務(wù)被線程執(zhí)行,其與Runnable接口的區(qū)別在于Callable任務(wù)可以有返回值,而Runnable任務(wù)沒有返回值。

由于Thread對(duì)象只能執(zhí)行Runnable任務(wù),因此無法直接讓Thread執(zhí)行Callable任務(wù),但是可以先將Callable封裝成FutureTask,而FutureTask是實(shí)現(xiàn)了Runnable接口的,所以Thread對(duì)象可以執(zhí)行FutureTask任務(wù)。示例如下。

public class ThreadTest {

    @Test
    public void 基于Callable() throws Exception {
        // 創(chuàng)建Callable任務(wù)對(duì)象
        Callable<String> callable = new Callable<String>() {
            @Override
            public String call() throws Exception {
                return "任務(wù)執(zhí)行結(jié)果";
            }
        };

        // 將Callable封裝成FutureTask
        FutureTask<String> futureTask = new FutureTask<>(callable);

        // 創(chuàng)建Thread對(duì)象時(shí)將FutureTask通過構(gòu)造函數(shù)傳入
        Thread thread = new Thread(futureTask);

        // 啟動(dòng)線程
        thread.start();

        // 通過FutureTask拿到執(zhí)行結(jié)果
        System.out.println(futureTask.get());
    }

}

運(yùn)行測(cè)試程序,結(jié)果如下。

四. 基于Runnable創(chuàng)建FutureTask

在第三小節(jié)中是基于Callable來創(chuàng)建的FutureTask,本小節(jié)將基于Runnable來創(chuàng)建FutureTask。在此之前,先看一下FutureTask的類圖,如下所示。

所以FutureTask即能夠作為Runnable被執(zhí)行,也能夠作為Future獲取異步執(zhí)行的結(jié)果。FutureTask有兩個(gè)構(gòu)造函數(shù),簽名如下。

// 基于Callable創(chuàng)建FutureTask
public FutureTask(Callable<V> callable)

// 基于Runnable創(chuàng)建FutureTask
public FutureTask(Runnable runnable, V result)

下面重點(diǎn)看一下如何基于Runnable創(chuàng)建FutureTask,源碼如下所示。

public FutureTask(Runnable runnable, V result) {
    // 使用Executors工具類將Runnable封裝成Callable
    this.callable = Executors.callable(runnable, result);
    this.state = NEW;
}

繼續(xù)看Executors#callable(java.lang.Runnable, T) 方法,如下所示。

public static <T> Callable<T> callable(Runnable task, T result) {
    if (task == null) {
        throw new NullPointerException();
    }
    // 將Runnable封裝成RunnableAdapter
    return new RunnableAdapter<T>(task, result);
}

那么Executors#callable(java.lang.Runnable, T) 方法中就是將Runnable封裝成了RunnableAdapter,最后再看一下RunnableAdapter的實(shí)現(xiàn)。

static final class RunnableAdapter<T> implements Callable<T> {
    final Runnable task;
    final T result;
    
    RunnableAdapter(Runnable task, T result) {
        this.task = task;
        this.result = result;
    }
    
    public T call() {
        // 執(zhí)行Runnable的邏輯
        task.run();
        // 執(zhí)行完畢后,result作為結(jié)果返回
        return result;
    }
}

所以這里可以知道,基于Runnable創(chuàng)建FutureTask,其本質(zhì)是將Runnable先封裝為Callable,然后再將Callable封裝成FutureTask。還有一點(diǎn)需要注意,在基于Runnable創(chuàng)建FutureTask時(shí),除了傳入Runnable,還可以傳入一個(gè)作為返回結(jié)果的對(duì)象,Runnable執(zhí)行完畢后,會(huì)將這個(gè)對(duì)象返回,這個(gè)對(duì)象也可以傳一個(gè)null,表示不需要返回值。

基于Runnable創(chuàng)建FutureTask的一個(gè)示例如下。

public class ThreadTest {

    @Test
    public void 基于Runnable來構(gòu)建FutureTask() throws Exception {
        // 創(chuàng)建結(jié)果對(duì)象
        MyResult myResult = new MyResult();
        // 創(chuàng)建Runnable任務(wù)對(duì)象
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                myResult.setResult("任務(wù)執(zhí)行");
            }
        };

        // 將Runnable封裝成FutureTask
        // Runnable執(zhí)行后,會(huì)改變MyResult對(duì)象
        FutureTask<MyResult> futureTask = new FutureTask<>(runnable, myResult);

        // 創(chuàng)建Thread對(duì)象時(shí)將FutureTask通過構(gòu)造函數(shù)傳入
        Thread thread = new Thread(futureTask);

        // 啟動(dòng)線程
        thread.start();

        // 通過FutureTask拿到執(zhí)行結(jié)果
        System.out.println(futureTask.get().getResult());
    }

    private static class MyResult {
        String result;

        public MyResult() {}

        public MyResult(String result) {
            this.result = result;
        }

        public String getResult() {
            return result;
        }

        public void setResult(String result) {
            this.result = result;
        }
    }

}

運(yùn)行測(cè)試程序,結(jié)果如下所示。

總結(jié)

線程的創(chuàng)建,總的概括有三種方式。

  • 繼承Thread并重寫run()方法;
  • 創(chuàng)建Thread并執(zhí)行Runnable任務(wù);
  • 創(chuàng)建Thread并執(zhí)行Callable任務(wù)。

以上就是一文帶你搞懂Java中線程的創(chuàng)建方式的詳細(xì)內(nèi)容,更多關(guān)于Java線程創(chuàng)建方式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Springboot如何利用攔截器攔截請(qǐng)求信息收集到日志詳解

    Springboot如何利用攔截器攔截請(qǐng)求信息收集到日志詳解

    一些系統(tǒng)經(jīng)常需要關(guān)注用戶請(qǐng)求的具體信息,如用戶信息、請(qǐng)求參數(shù)、響應(yīng)結(jié)果等等,在SpringBoot應(yīng)用中可通過攔截器的方式統(tǒng)一處理,下面這篇文章主要給大家介紹了關(guān)于Springboot如何利用攔截器攔截請(qǐng)求信息收集到日志的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Springcloud之Gateway組件詳解

    Springcloud之Gateway組件詳解

    Spring Cloud Gateway是Spring Cloud微服務(wù)生態(tài)下的網(wǎng)關(guān)組件。Spring Cloud Gateway是基于Spring 5和Spring Boot 2搭建的,本質(zhì)上是一個(gè)Spring Boot應(yīng)用。本文詳細(xì)介紹了SpringCloud的網(wǎng)關(guān)組件 Gateway,,需要的朋友可以參考下
    2023-05-05
  • SpringMVC深入講解文件的上傳下載實(shí)現(xiàn)

    SpringMVC深入講解文件的上傳下載實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了springMVC實(shí)現(xiàn)文件上傳和下載的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • JavaWeb中的Response常用方法解析

    JavaWeb中的Response常用方法解析

    這篇文章主要介紹了JavaWeb中的Response常用方法解析,response對(duì)象是用來對(duì)客戶端進(jìn)行響應(yīng)的當(dāng)瀏覽器發(fā)出請(qǐng)求時(shí),?Web容器創(chuàng)建一個(gè)ServletRequest對(duì)象封裝請(qǐng)求信息,一個(gè)ServletResponse對(duì)象封裝響應(yīng)信息,對(duì)象作為Servlet的service()方法中的參數(shù),需要的朋友可以參考下
    2023-11-11
  • Java通過Fork/Join優(yōu)化并行計(jì)算

    Java通過Fork/Join優(yōu)化并行計(jì)算

    這篇文章主要為大家詳細(xì)介紹了Java通過Fork、Join來優(yōu)化并行計(jì)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 談?wù)凷pring Boot 數(shù)據(jù)源加載及其多數(shù)據(jù)源簡(jiǎn)單實(shí)現(xiàn)(小結(jié))

    談?wù)凷pring Boot 數(shù)據(jù)源加載及其多數(shù)據(jù)源簡(jiǎn)單實(shí)現(xiàn)(小結(jié))

    這篇文章主要介紹了談?wù)凷pring Boot 數(shù)據(jù)源加載及其多數(shù)據(jù)源簡(jiǎn)單實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04
  • IntelliJ IDEA中查看文件內(nèi)所有已聲明的方法(類似eclipse的outline)

    IntelliJ IDEA中查看文件內(nèi)所有已聲明的方法(類似eclipse的outline)

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA中查看文件內(nèi)所有已聲明的方法(類似eclipse的outline),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • 詳解IntelliJ IDEA 自帶的 HTTP Client 接口調(diào)用插件吊打 Postman

    詳解IntelliJ IDEA 自帶的 HTTP Client 接口調(diào)用插件吊打 Postman

    HTTP Client 是 IDEA 自帶的一款簡(jiǎn)潔輕量級(jí)的接口調(diào)用插件,通過它,我們能在 IDEA 上開發(fā),調(diào)試,測(cè)試 RESTful Web 服務(wù),接下來通過本文給大家分享IntelliJ IDEA 自帶的 HTTP Client 接口調(diào)用插件吊打 Postman的知識(shí),感興趣的朋友一起看看吧
    2021-05-05
  • Java檢測(cè)網(wǎng)絡(luò)是否正常通訊

    Java檢測(cè)網(wǎng)絡(luò)是否正常通訊

    在網(wǎng)絡(luò)應(yīng)用程序中,檢測(cè)IP地址和端口是否通常是必要的,本文主要介紹了Java檢測(cè)網(wǎng)絡(luò)是否正常通訊,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • Spring Cloud Zuul集成Swagger實(shí)現(xiàn)過程解析

    Spring Cloud Zuul集成Swagger實(shí)現(xiàn)過程解析

    這篇文章主要介紹了Spring Cloud Zuul集成Swagger實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論