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

簡(jiǎn)單談?wù)凾hreadPoolExecutor線程池之submit方法

 更新時(shí)間:2017年06月19日 08:25:51   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇簡(jiǎn)單談?wù)凾hreadPoolExecutor線程池之submit方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

jdk1.7.0_79

在上一篇《ThreadPoolExecutor線程池原理及其execute方法》中提到了線程池ThreadPoolExecutor的原理以及它的execute方法。本文解析ThreadPoolExecutor#submit。

對(duì)于一個(gè)任務(wù)的執(zhí)行有時(shí)我們不需要它返回結(jié)果,但是有我們需要它的返回執(zhí)行結(jié)果。對(duì)于線程來(lái)講,如果不需要它返回結(jié)果則實(shí)現(xiàn)Runnable,而如果需要執(zhí)行結(jié)果的話則可以實(shí)現(xiàn)Callable。在線程池同樣execute提供一個(gè)不需要返回結(jié)果的任務(wù)執(zhí)行,而對(duì)于需要結(jié)果返回的則可調(diào)用其submit方法。

回顧ThreadPoolExecutor的繼承關(guān)系。

在Executor接口中只定義了execute方法,而submit方法則是在ExecutorService接口中定義的。

//ExecutorService
public interface ExecutorService extends Executor {
  ...
  <T> Future<T> submit(Callable<T> task);
  <T> Future<T> submit(Runnable task, T result);
  <T> Future<T> submit(Runnable task);
  ...
}

而在其子類AbstractExecutorService實(shí)現(xiàn)了submit方法。

//AbstractExecutorService
public abstract class AbstractExecutorService implements ExecutorService {
  ...
  public <T> Future<T> submit(Callable<T> task) {
    if (task == null) throw new NullPointerException();
    RunnableFuture<T> ftask = newTaskFor(task);
    execute(ftask);
    return ftask;
  }
  public <T> Future<T> submit(Runnable task, T result) {
    if (task == null) throw new NullPointerException();
    RunnableFuture<T> ftask = newTaskFor(task);
    execute(ftask);
    return ftask;
  }
  public Future<?> submit(Runnable task) {
    if (task == null) throw new NullPointerExeption();
    RunnableFuture<Void> ftask = newTaskFor(task, null);
    execute(ftask);
    return ftask; 
  }
  ...
}

在AbstractExecutorService實(shí)現(xiàn)的submit方法實(shí)際上是一個(gè)模板方法,定義了submit方法的算法骨架,其execute交給了子類。(可以看到在很多源碼中,模板方法模式被大量運(yùn)用,有關(guān)模板方法模式可參考《模板方法模式》)

盡管submit方法能提供線程執(zhí)行的返回值,但只有實(shí)現(xiàn)了Callable才會(huì)有返回值,而實(shí)現(xiàn)Runnable的線程則是沒(méi)有返回值的,也就是說(shuō)在上面的3個(gè)方法中,submit(Callable<T> task)能獲取到它的返回值,submit(Runnable task, T result)能通過(guò)傳入的載體result間接獲得線程的返回值或者準(zhǔn)確來(lái)說(shuō)交給線程處理一下,而最后一個(gè)方法submit(Runnable task)則是沒(méi)有返回值的,就算獲取它的返回值也是null。

下面給出3個(gè)例子,來(lái)感受下submit方法。

submit(Callable<T> task)

package com.threadpoolexecutor;

import java.util.concurrent.*;

/**
 * ThreadPoolExecutor#sumit(Callable<T> task)
 * Created by yulinfeng on 6/17/17.
 */
public class Sumit1 {

 public static void main(String[] args) throws ExecutionException, InterruptedException {
 Callable<String> callable = new Callable<String>() {
 public String call() throws Exception {
 System.out.println("This is ThreadPoolExetor#submit(Callable<T> task) method.");
 return "result";
 }
 };

 ExecutorService executor = Executors.newSingleThreadExecutor();
 Future<String> future = executor.submit(callable);
 System.out.println(future.get());
 }
}

submit(Runnable task, T result)

package com.threadpoolexecutor;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * ThreadPoolExecutor#submit(Runnable task, T result)
 * Created by yulinfeng on 6/17/17.
 */
public class Submit2 {

 public static void main(String[] args) throws ExecutionException, InterruptedException {

 ExecutorService executor = Executors.newSingleThreadExecutor();
 Data data = new Data();
 Future<Data> future = executor.submit(new Task(data), data);
 System.out.println(future.get().getName());
 }
}

class Data {
 String name;

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }
}

class Task implements Runnable {
 Data data;

 public Task(Data data) {
 this.data = data;
 }
 public void run() {
 System.out.println("This is ThreadPoolExetor#submit(Runnable task, T result) method.");
 data.setName("kevin");
 }
}

submit(Runnable task)

package com.threadpoolexecutor;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * ThreadPoolExecutor#sumit(Runnable runnables)
 * Created by yulinfeng on 6/17/17.
 */
public class Submit {

 public static void main(String[] args) throws ExecutionException, InterruptedException {
 Runnable runnable = new Runnable() {
 public void run() {
 System.out.println("This is ThreadPoolExetor#submit(Runnable runnable) method.");
 }
 };

 ExecutorService executor = Executors.newSingleThreadExecutor();
 Future future = executor.submit(runnable);
 System.out.println(future.get());
 }
}

通過(guò)上面的實(shí)例可以看到在調(diào)用submit(Runnable runnable)的時(shí)候是不需要其定義類型的,也就是說(shuō)雖然在ExecutorService中對(duì)其定義的是泛型方法,而在AbstractExecutorService中則不是泛型方法,因?yàn)樗鼪](méi)有返回值。(有關(guān)Object、T、?這三者的區(qū)別,可參考《Java中的Object、T(泛型)、?區(qū)別》)。

從上面的源碼可以看到,這三者方法幾乎是一樣的,關(guān)鍵就在于:

RunnableFuture<T> ftask = newTaskFor(task);
execute(ftask);

它是如何將一個(gè)任務(wù)作為參數(shù)傳遞給了newTaskFor,然后調(diào)用execute方法,最后進(jìn)而返回ftask的呢?

//AbstractExecutorService#newTaskFor
protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
  return new FutureTask<T>(callable);
}
  protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
  return new FutureTask<T>(runnable, value);
}

看來(lái)是返回了一個(gè)FutureTask實(shí)例,F(xiàn)utureTask實(shí)現(xiàn)了Future和Runnable接口。Future接口是Java線程Future模式的實(shí)現(xiàn),可用用來(lái)異步計(jì)算,實(shí)現(xiàn)Runnable接口表示可以作為一個(gè)線程執(zhí)行。FutureTask實(shí)現(xiàn)了這兩個(gè)接口意味著它代表異步計(jì)算的結(jié)果,同時(shí)可以作為一個(gè)線程交給Executor來(lái)執(zhí)行。有關(guān)FutureTask放到下章來(lái)單獨(dú)解析。所以本文對(duì)于線程池ThreadPoolExecutor線程池的submit方法解析并不完整,必須得了解Java線程的Future模式——《老生常談Java中的Future模式》。

以上這篇簡(jiǎn)單談?wù)凾hreadPoolExecutor線程池之submit方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis枚舉類型轉(zhuǎn)換源碼分析

    Mybatis枚舉類型轉(zhuǎn)換源碼分析

    在Mybatis的TypeHandlerRegistry中,添加了常用的類轉(zhuǎn)換器,其中默認(rèn)的枚舉類型轉(zhuǎn)換器是EnumTypeHandler,這篇文章主要介紹了Mybatis枚舉類型轉(zhuǎn)換源碼分析,需要的朋友可以參考下
    2024-05-05
  • 詳解SpringBoot時(shí)間參數(shù)處理完整解決方案

    詳解SpringBoot時(shí)間參數(shù)處理完整解決方案

    這篇文章主要介紹了詳解SpringBoot時(shí)間參數(shù)處理完整解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 深入理解LinkedHashSet集合的底層機(jī)制

    深入理解LinkedHashSet集合的底層機(jī)制

    這篇文章主要介紹了LinkedHashSet的底層機(jī)制詳解,LinkedHashSet根據(jù)元素的hashCode值來(lái)決定元素的存儲(chǔ)位置,同時(shí)使用鏈表維護(hù)元素的次序,?這使得元素看起來(lái)是以插入順序保存的,需要的朋友可以參考下
    2023-10-10
  • SpringBoot2.x實(shí)現(xiàn)給Controller的RequestMapping添加統(tǒng)一前綴

    SpringBoot2.x實(shí)現(xiàn)給Controller的RequestMapping添加統(tǒng)一前綴

    這篇文章主要介紹了SpringBoot2.x實(shí)現(xiàn)給Controller的RequestMapping添加統(tǒng)一前綴,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解

    Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解

    這篇文章主要介紹了Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 深入理解ThreadLocal工作原理及使用示例

    深入理解ThreadLocal工作原理及使用示例

    這篇文章主要介紹了深入理解ThreadLocal工作原理及使用示例,涉及ThreadLocal<T> 簡(jiǎn)介和使用示例及ThreadLocal<T>的原理等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Spring?boot?Jpa添加對(duì)象字段使用數(shù)據(jù)庫(kù)默認(rèn)值操作

    Spring?boot?Jpa添加對(duì)象字段使用數(shù)據(jù)庫(kù)默認(rèn)值操作

    這篇文章主要介紹了Spring?boot?Jpa添加對(duì)象字段使用數(shù)據(jù)庫(kù)默認(rèn)值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中String、StringBuffer和StringBuilder的區(qū)別

    Java中String、StringBuffer和StringBuilder的區(qū)別

    這篇文章主要介紹了Java中String、StringBuffer和StringBuilder的區(qū)別,StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數(shù)組保存字符串char[]value但是沒(méi)有final關(guān)鍵字修飾,所以這兩個(gè)可變,需要的朋友可以參考下
    2024-01-01
  • Java中讓界面內(nèi)的時(shí)間及時(shí)更新示例代碼

    Java中讓界面內(nèi)的時(shí)間及時(shí)更新示例代碼

    這篇文章主要給大家介紹了關(guān)于Java中讓界面內(nèi)的時(shí)間及時(shí)更新的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • springboot集成fastDfs過(guò)程代碼實(shí)例

    springboot集成fastDfs過(guò)程代碼實(shí)例

    這篇文章主要介紹了springboot集成fastDfs過(guò)程代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論

颍上县| 乐安县| 贵港市| 武宁县| 南宁市| 潞西市| 阳高县| 张北县| 九台市| 噶尔县| 乳源| 芜湖市| 依安县| 玉山县| 噶尔县| 宝清县| 马龙县| 上高县| 稻城县| 临猗县| 仁化县| 句容市| 易门县| 临潭县| 阜阳市| 榆树市| 东海县| 南岸区| 马尔康县| 郁南县| 新建县| 巴东县| 武定县| 罗江县| 北流市| 建阳市| 乐平市| 高台县| 且末县| 邛崃市| 遵化市|