亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

多線程相關 Thread、Runnable、Callable、Futrue類關系與區別

2019-11-09 14:30:58
字體:
來源:轉載
供稿:網友
java中存在Runnable、Callable、Future、FutureTask這幾個與線程相關的類或者接口,在Java中也是比較重要的幾個概念,我們通過下面的簡單示例來了解一下它們的作用于區別。

Runnable

其中Runnable應該是我們最熟悉的接口,它只有一個run()函數,用于將耗時操作寫在其中,該函數沒有返回值。然后使用某個線程去執行該runnable即可實現多線程,Thread類在調用start()函數后就是執行的是Runnable的run()函數。Runnable的聲明如下 : 

[java] view plain copy在CODE上查看代碼片public interface Runnable {      /**      * When an object implementing interface <code>Runnable</code> is used      * to create a thread, starting the thread causes the object's      * <code>run</code> method to be called in that separately executing      * thread.      * <p>      *      * @see     java.lang.Thread#run()      */      public abstract void run();  }  

Callable

Callable與Runnable的功能大致相似,Callable中有一個call()函數,但是call()函數有返回值,而Runnable的run()函數不能將結果返回給客戶程序。Callable的聲明如下 :

[java] view plain copy在CODE上查看代碼片public interface Callable<V> {      /**      * Computes a result, or throws an exception if unable to do so.      *      * @return computed result      * @throws Exception if unable to compute a result      */      V call() throws Exception;  }  可以看到,這是一個泛型接口,call()函數返回的類型就是客戶程序傳遞進來的V類型。

Future

Executor就是Runnable和Callable的調度容器,Future就是對于具體的Runnable或者Callable任務的執行結果進行

取消、查詢是否完成、獲取結果、設置結果操作。get方法會阻塞,直到任務返回結果(Future簡介)。Future聲明如下 :

[java] view plain copy在CODE上查看代碼片/** * @see FutureTask  * @see Executor  * @since 1.5  * @author Doug Lea  * @param <V> The result type returned by this Future's <tt>get</tt> method  */  public interface Future<V> {        /**      * Attempts to cancel execution of this task.  This attempt will      * fail if the task has already completed, has already been cancelled,      * or could not be cancelled for some other reason. If successful,      * and this task has not started when <tt>cancel</tt> is called,      * this task should never run.  If the task has already started,      * then the <tt>mayInterruptIfRunning</tt> parameter determines      * whether the thread executing this task should be interrupted in      * an attempt to stop the task.     *      */      boolean cancel(boolean mayInterruptIfRunning);        /**      * Returns <tt>true</tt> if this task was cancelled before it completed      * normally.      */      boolean isCancelled();        /**      * Returns <tt>true</tt> if this task completed.      *      */      boolean isDone();        /**      * Waits if necessary for the computation to complete, and then      * retrieves its result.      *      * @return the computed result      */      V get() throws InterruptedException, ExecutionException;        /**      * Waits if necessary for at most the given time for the computation      * to complete, and then retrieves its result, if available.      *      * @param timeout the maximum time to wait      * @param unit the time unit of the timeout argument      * @return the computed result      */      V get(long timeout, TimeUnit unit)          throws InterruptedException, ExecutionException, TimeoutException;  }  

FutureTask

FutureTask則是一個RunnableFuture<V>,而RunnableFuture實現了Runnbale又實現了Futrue<V>這兩個接口,

[java] view plain copy在CODE上查看代碼片public class FutureTask<V> implements RunnableFuture<V>  RunnableFuture

[java] view plain copy在CODE上查看代碼片public interface RunnableFuture<V> extends Runnable, Future<V> {      /**      * Sets this Future to the result of its computation      * unless it has been cancelled.      */      void run();  }  

另外它還可以包裝Runnable和Callable<V>, 由構造函數注入依賴。

[java] view plain copy在CODE上查看代碼片public FutureTask(Callable<V> callable) {      if (callable == null)          throw new NullPointerException();      this.callable = callable;      this.state = NEW;       // ensure visibility of callable  }    public FutureTask(Runnable runnable, V result) {      this.callable = Executors.callable(runnable, result);      this.state = NEW;       // ensure visibility of callable  }  可以看到,Runnable注入會被Executors.callable()函數轉換為Callable類型,即FutureTask最終都是執行Callable類型的任務。該適配函數的實現如下 :

[java] view plain copy在CODE上查看代碼片public static <T> Callable<T> callable(Runnable task, T result) {      if (task == null)          throw new NullPointerException();      return new RunnableAdapter<T>(task, result);  }  RunnableAdapter適配器

[java] view plain copy在CODE上查看代碼片/**  * A callable that runs given task and returns given result  */  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() {          task.run();          return result;      }  }  

由于FutureTask實現了Runnable,因此它既可以通過Thread包裝來直接執行,也可以提交給ExecuteService來執行。

并且還可以直接通過get()函數獲取執行結果,該函數會阻塞,直到結果返回。因此FutureTask既是Future、

Runnable,又是包裝了Callable( 如果是Runnable最終也會被轉換為Callable ), 它是這兩者的合體。

簡單示例

[java] view plain copy在CODE上查看代碼片 package com.effective.java.concurrent.task;    import java.util.concurrent.Callable;  import java.util.concurrent.ExecutionException;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  import java.util.concurrent.Future;  import java.util.concurrent.FutureTask;    /**  *   * @author mrsimple  *  */  public class RunnableFutureTask {        /**      * ExecutorService      */      static ExecutorService mExecutor = Executors.newSingleThreadExecutor();        /**      *       * @param args      */      public static void main(String[] args) {          runnableDemo();          futureDemo();      }        /**      * runnable, 無返回值      */      static void runnableDemo() {            new Thread(new Runnable() {                @Override              public void run() {                  System.out.

輸出結果

Thread、Runnable、Callable,其中Runnable實現的是void run()方法,Callable實現的是 V call()方法,并且可以返回執行結果,其中Runnable可以提交給Thread來包裝下,直接啟動一個線程來執行,而Callable則一般都是提交給ExecuteService來執行。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产91久久久久| 亚洲一区999| 日韩三级影视基地| 97视频在线观看免费高清完整版在线观看| 亚洲欧美日本伦理| 亚洲国产精品电影在线观看| 国产成人精品a视频一区www| 欧美丝袜一区二区三区| 国产日韩中文字幕在线| 久久久久久久国产精品视频| 欧洲午夜精品久久久| 久久伊人免费视频| 欧美国产精品va在线观看| 亚洲少妇激情视频| 日韩在线观看电影| 久久中文字幕在线视频| 亚洲精品久久久久国产| 久久久久久国产精品三级玉女聊斋| 成人在线激情视频| 欧美限制级电影在线观看| 麻豆一区二区在线观看| 久久久久亚洲精品国产| 亚洲男人天堂九九视频| 久久久国产成人精品| 亚洲精品国产福利| 2019中文字幕免费视频| 韩国一区二区电影| 亚洲精品按摩视频| 永久免费精品影视网站| 精品久久久久久中文字幕大豆网| 亚洲自拍高清视频网站| 日韩视频永久免费观看| 成人午夜在线视频一区| 欧洲美女免费图片一区| 韩国精品久久久999| 久久视频免费在线播放| 国产午夜精品一区理论片飘花| 国产精品海角社区在线观看| 国产suv精品一区二区| 国产精品入口夜色视频大尺度| 国产69精品久久久久久| 日韩美女av在线免费观看| 久久久免费精品视频| 在线精品播放av| 国产精品免费久久久久影院| 亚洲va男人天堂| 国产亚洲一级高清| 国产主播欧美精品| 欧美精品成人91久久久久久久| 亚洲成人激情在线| 久久91精品国产91久久跳| 亚洲一区二区三区四区在线播放| 国产精品综合不卡av| 一区二区三区国产在线观看| 日韩欧美在线一区| 久久99热这里只有精品国产| 青青草一区二区| 日韩欧美国产免费播放| 国产一区二区三区精品久久久| 久久久久久久久久久免费精品| 日本三级韩国三级久久| 国产精品小说在线| 欧洲午夜精品久久久| 欧美日韩ab片| 国产69精品99久久久久久宅男| 91在线高清免费观看| 午夜精品福利电影| xxx一区二区| 国产自产女人91一区在线观看| 国产一区二区成人| 日韩av日韩在线观看| 一区二区亚洲精品国产| 国产a∨精品一区二区三区不卡| 欧美日韩美女在线观看| 国产精品旅馆在线| 欧美激情久久久久久| 久久久久久久香蕉网| 日韩av三级在线观看| 在线视频中文亚洲| 国产日产久久高清欧美一区| 国产亚洲xxx| 正在播放国产一区| 国产a级全部精品| 亚洲欧美国产精品专区久久| 国产综合在线视频| 成人免费在线网址| 国产成人a亚洲精品| 亚洲影影院av| 欧美日韩在线一区| 日韩中文字幕在线| 国产精品人人做人人爽| 91久久久国产精品| 日韩久久免费视频| 美女撒尿一区二区三区| 欧美老少做受xxxx高潮| 久久天天躁夜夜躁狠狠躁2022| 色偷偷偷综合中文字幕;dd| 国产精品一区二区久久国产| 伦理中文字幕亚洲| 国产亚洲人成网站在线观看| 国产精品福利小视频| 最近中文字幕mv在线一区二区三区四区| 51精品在线观看| 成人在线国产精品| 亚洲国产欧美一区二区三区同亚洲| 欧美日韩性生活视频| 亚洲乱码一区av黑人高潮| 色综合久久精品亚洲国产| 国产精品福利片| 98精品国产高清在线xxxx天堂| 日韩av在线导航| 久久久91精品国产一区不卡| 国产精品欧美日韩久久| 久久国产精彩视频| 91综合免费在线| 亚洲女在线观看| 亚洲视频一区二区| 中文字幕免费国产精品| 色伦专区97中文字幕| 亚洲区中文字幕| 日韩中文字幕不卡视频| 亚洲黄色av女优在线观看| 国产成人精品国内自产拍免费看| 久久精品亚洲国产| 欧美肥老妇视频| 国产精品亚洲一区二区三区| 国产精品视频精品| 亚洲精品日韩在线| 另类色图亚洲色图| 亚洲男人的天堂在线| 亚洲第一精品电影| 98视频在线噜噜噜国产| 成人精品网站在线观看| 日韩av在线播放资源| 91av成人在线| 国产欧美日韩精品在线观看| 亚洲精品中文字幕av| 欧美一区三区三区高中清蜜桃| 97国产精品视频人人做人人爱| 欧美精品在线免费播放| 国产成人精品优优av| 欧美性xxxx极品高清hd直播| 麻豆国产精品va在线观看不卡| 色婷婷**av毛片一区| 日韩av电影在线网| 国产美女精品视频免费观看| 久久91超碰青草是什么| 国产婷婷色综合av蜜臀av| 精品国产乱码久久久久酒店| 亚洲色图美腿丝袜| 欧美性猛交丰臀xxxxx网站| 国产欧美一区二区三区久久| 日韩风俗一区 二区| 国外色69视频在线观看| 欧美人与性动交a欧美精品| 一区二区三区在线播放欧美| 日韩av在线影视| 68精品久久久久久欧美| 精品高清一区二区三区| 国产精品一区二区三区毛片淫片| 亚洲国产精久久久久久| 国产精品一区二区三区成人| 亚洲激情视频在线| 久久亚洲精品视频|