程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java自界說義務類准時履行義務示例 callable和future接口應用辦法

java自界說義務類准時履行義務示例 callable和future接口應用辦法

編輯:關於JAVA

java自界說義務類准時履行義務示例 callable和future接口應用辦法。本站提示廣大學習愛好者:(java自界說義務類准時履行義務示例 callable和future接口應用辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是java自界說義務類准時履行義務示例 callable和future接口應用辦法正文


Callable 和 Future接口

Callable是相似於Runnable的接口,完成Callable接口的類和完成Runnable的類都是可被其它線程履行的義務。

Callable和Runnable有幾點分歧:
(1)Callable劃定的辦法是call(),而Runnable劃定的辦法是run().
(2)Callable的義務履行後可前往值,而Runnable的義務是不克不及前往值的。
(3)call()辦法可拋出異常,而run()辦法是不克不及拋出異常的。
(4)運轉Callable義務可拿到一個Future對象, Future表現異步盤算的成果。

它供給了檢討盤算能否完成的辦法,以期待盤算的完成,並檢索盤算的成果。
經由過程Future對象可懂得義務履行情形,可撤消義務的履行,還可獲得義務履行的成果。



package com.yao;

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

public class CallableAndFuture {

 /**
  * 自界說一個義務類,完成Callable接口
  */
 public static class MyCallableClass implements Callable {
  // 標記位
  private int flag = 0;

  public MyCallableClass(int flag) {
   this.flag = flag;
  }

  public String call() throws Exception {
   if (this.flag == 0) {
    // 假如flag的值為0,則立刻前往
    return "flag = 0";
   }
   if (this.flag == 1) {
    // 假如flag的值為1,做一個無窮輪回
    try {
     while (true) {
      System.out.println("looping......");
      Thread.sleep(2000);
     }
    } catch (InterruptedException e) {
     System.out.println("Interrupted");
    }
    return "false";
   } else {
    // falg不為0或許1,則拋出異常
    throw new Exception("Bad flag value!");
   }
  }
 }

 public static void main(String[] args) {
  // 界說3個Callable類型的義務
  MyCallableClass task1 = new MyCallableClass(0);
  MyCallableClass task2 = new MyCallableClass(1);
  MyCallableClass task3 = new MyCallableClass(2);

  // 創立一個履行義務的辦事
  ExecutorService es = Executors.newFixedThreadPool(3);
  try {
   // 提交並履行義務,義務啟動時前往了一個Future對象,
   // 假如想獲得義務履行的成果或許是異常可對這個Future對象停止操作
   Future future1 = es.submit(task1);
   // 取得第一個義務的成果,假如挪用get辦法,以後線程會期待義務履行終了後才往下履行
   System.out.println("task1: " + future1.get());

   Future future2 = es.submit(task2);
   // 期待5秒後,再停滯第二個義務。由於第二個義務停止的是無窮輪回
   Thread.sleep(5000);
   System.out.println("task2 cancel: " + future2.cancel(true));

   // 獲得第三個義務的輸入,由於履行第三個義務會惹起異常
   // 所以上面的語句將惹起異常的拋出
   Future future3 = es.submit(task3);
   System.out.println("task3: " + future3.get());
  } catch (Exception e) {
   System.out.println(e.toString());
  }
  // 停滯義務履行辦事
  es.shutdownNow();
 }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved