JAvaカスタムタスククラスタイミング実行タスク例callableとfutureインタフェースの使用方法

2683 ワード

CallableおよびFutureインタフェースCallableは、Runnableと同様のインタフェースであり、Callableインタフェースを実装するクラスおよびRunnableを実装するクラスは、他のスレッドによって実行可能なタスクである.CallableとRunnableにはいくつかの違いがあります.(1)Callableではcall()が規定されていますが、Runnableではrun()が規定されています.(2)Callableのタスクは実行後に値を返すことができますが、Runnableのタスクは値を返すことができません.(3)call()メソッドは異常を放出することができ,run()メソッドは異常を放出することができない.(4)Callableタスクを実行すると,非同期計算の結果を表す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();
 }
}