• <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>

    java多線程創建方式三Callable

    在前面我們講述了建立線程的2種體例,一種是直接擔當Thread,別的一種就是實現Runnable接口。

      這2種體例都有一個缺陷就是:在執行完使命之后無法獲取執行成果。

      若是需要獲取執行成果,就必需經由過程共享變量或者利用線程通信的體例來達到結果,這樣利用起來就比力麻煩。

      而自從Java 1.5起頭,就供給了Callable和Future,經由過程它們可以在使命執行完畢之后獲得使命執行成果。

      今天我們就來會商一下Callable、Future和FutureTask三個類的利用方式。以下是本文的目次綱領:

      一.Callable與Runnable

      二.Future

      三.FutureTask

    東西/原料

    • 電腦
    • intellij IDEA

    方式/步調

    1. 1

      建立一個實現callable的實現類

      具體代碼如下所示:

      import java.util.concurrent.Callable;

      import java.util.concurrent.ExecutionException;


      /**

       * 建立線程的體例三:實現callable接口 --》jdk5.0新增

       */


      // 1、建立一個實現callable的實現類

      public class NumThread implements Callable<Integer> {


      private int length;


      public void setLength(int length) {

      this.length = length;

      }


      // 2、實現call方式,將此線程需要執行的操出聲明在call方式中

      public Integer call() throws Exception {


      int sum = 0;

      for (int i = 0; i <= length; i++) {


      if (i % 2 == 0) {

      sum += i;

      System.out.println(i);

      }

      }

      return sum;

      }

      }

    2. 2

      編寫測試類

      代碼如下所示:

      import java.util.concurrent.FutureTask;

      public class ThreadNew {


      public static void main(String[] args) {

      // 3、建立callable實現類的對象

      NumThread numThread = new NumThread();

      // 3.1 傳參數

      numThread.setLength(100);


      // 4、將此callable實現類的對象作為參數傳遞到FutureTask的機關器中,建立FutureTask對象

      FutureTask<Integer> integerFutureTask = new FutureTask<Integer>(

      numThread);

      // 5、將FutureTask作為參數傳遞Thread機關器中,建立Thread對象,并挪用start方式

      new Thread(integerFutureTask).start();

      try {

      // 6、獲取Callable中call方式中的返回值

      // get()返回值即為futureTask機關器參數Callable實現類重寫的call的返回值

      Integer sum = integerFutureTask.get();

      System.out.println("總計:" + sum);

      } catch (InterruptedException e) {

      e.printStackTrace();

      } catch (ExecutionException e) {

      e.printStackTrace();

      }


      }

      }

    3. 3

      代碼詳解:

      1、相較于Thread和Runable實現多線程的體例其可以獲取線程執行的返回值

      2、在NumThread 中的以下代碼是按照set方式體例標的目的callable實現類中傳參數,然后再call方式中利用。

      private int length;


      public void setLength(int length) {

      this.length = length;

      }

    4. 4

      測試

      運行代碼

    5. 5

      總結:

      若何理解實現callable接口的體例建立多線程比實現Runable接口建立線程的體例壯大?

        1、call() 可以返回肆意值

        2、call() 可以拋出異常,被外面的操作捕捉,獲取異常的信息

        3、Callable是撐持泛型的

    注重事項

    • jdk 1.8 intellij IDEA 2018
    • 發表于 2019-08-03 23:25
    • 閱讀 ( 629 )
    • 分類:其他類型

    相關問題

    0 條評論

    請先 登錄 后評論
    聯系我們:uytrv@hotmail.com 問答工具
  • <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>
    久久久久精品国产麻豆