如何實現處理線程的返回值?


如何實現處理線程的返回值?
1、主線程等待法 缺點:需要自己實現循環等待的邏輯,當需要等待的變量較多時,代碼異常臃腫。
2、使用thread類的join()阻擋當前線程以等待子線程處理完畢。  缺點:控制力度不夠精細。
3、通過callable接口實現,通過FutureTask Or 線程池獲取。

一、那么,直接上代碼吧,我們首先開始第一種方法。先創建一個類CycleWait,如下所示:
public class CycleWait implements Runnable {

  private String value;

  @Override
  public void run() {
    try {
      Thread.currentThread().sleep(5000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    value = "we have date now";
  }

  public static void main(String[] args) throws InterruptedException {
    CycleWait wait = new CycleWait();
    Thread thread = new Thread(wait);
    thread.start();
    //當值為null的時候一直循環,直到有值的時候才會返回。
    //少了這一步,則可能取出為空的值。
    while (wait.value == null) {
      try {
        Thread.currentThread().sleep(100);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    System.out.println(wait.value);
  }
}

  在循環到CycleWait執行完成時,會輸出結果 we have date now。 

二、去掉循環體,使用join方法。給一返回結果一樣。

public class CycleWait implements Runnable {

  private String value;

  @Override
  public void run() {
    try {
      Thread.currentThread().sleep(5000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    value = "we have date now";
  }

  public static void main(String[] args) throws InterruptedException {
    CycleWait wait = new CycleWait();
    Thread thread = new Thread(wait);
    thread.start();
    //當值為null的時候一直循環,直到有值的時候才會返回。
    //少了這一步,則可能取出為空的值。
    thread.join();
    System.out.println(wait.value);
  }
}

  三、使用FutureTask獲得結果,進行控制。

public class myCallable implements Callable {
  @Override
  public String call() throws Exception {
    String value = "test";
    System.out.println("ready to work");
    Thread.currentThread().sleep(5000);
    System.out.println("task down");
    return value;
  }
}

  

public class FutureTaskDemo {

  public static void main(String[] args) throws ExecutionException, InterruptedException {
    FutureTask<String> futureTask = new FutureTask<String>(new myCallable());
    new Thread(futureTask).start();
    if (!futureTask.isDone()) {
      System.out.println("task has not ");
    }
    System.out.println("task reture:{}" + futureTask.get());
  }
}

  四、線程池的方式。好處:可以實現提交多個myCallable方法的線程,是線程池並發的去處理結果。

public class ThreadPoolDemo {

  public static void main(String[] args) {
    //創建線程池
    ExecutorService executorService = Executors.newCachedThreadPool();
    //提交myCallable的任務去執行
    Future<String> future = executorService.submit(new myCallable());
    if (!future.isDone()) {
      System.out.println("task has not ");
    }
    try {
      System.out.println("task reture:{}" + future.get());
    } catch (InterruptedException e) {
      e.printStackTrace();
    } catch (ExecutionException e) {
      e.printStackTrace();
    } finally {
      //關閉線程池
      executorService.shutdown();
    }
  }

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM