Java 多线程 Callable Future

Java 多线程 Callable Future

package thread.pool;

import java.util.concurrent.Callable;

/**
 * Callable 和 Future接口
 * Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
 * Callable和Runnable有几点不同:
 * (1)Callable规定的方法是call(),而Runnable规定的方法是run().
 * (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
 * (3)call()方法可抛出异常,而run()方法是不能抛出异常的。
 * (4)运行Callable任务可拿到一个Future对象,Future 表示异步计算的结果。
 * 它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
 * 通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
 */
public class SayCallable implements Callable {
  private String taskname;
  private int taskflag = 0;

  public SayCallable(String name, int flag) {
    taskname = name;
    taskflag = flag;
  }

  public String call() throws Exception {
    if (taskflag == 0) {
      return taskname + ", flag = " + taskflag;
    }

    if (taskflag == 1 || taskflag == 2) {
      try {
        while (true) {
          System.out.println("hi");
          Thread.sleep(200);
        }
      } catch (InterruptedException e) {
        System.out.println(taskname + ", exception = " + e.toString());
        // 由于阻塞函数(wait, sleep, join 等函数)除了抛出异常外,
        // 还会清除线程中断状态,因此在这里要保留线程的中断状态。
        Thread.currentThread().interrupt();
      }
      return taskname + ", flag = " + taskflag;
    } else {
      return taskname + ", flag = " + taskflag;
    }
  }
}
package thread.pool;

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

public class Test {
  
  /**
   * @author jzh add 2011-12-21
   * @param args
   */
  @SuppressWarnings({ "rawtypes", "unchecked" })
  public static void main(String[] args) {

    // 定义3个Callable类型的任务
    SayCallable task1 = new SayCallable("task1", 0);
    SayCallable task2 = new SayCallable("task2", 1);
    SayCallable task3 = new SayCallable("task3", 1);

    // 创建一个线程池(指定线程数量为3)
    // Executors 类提供了用于此包中所提供的执行程序服务的工厂方法
    ExecutorService pool = Executors.newFixedThreadPool(3);
    
    // 第一个任务
    try {
      // 采用submit提交并执行任务,然后返回了一个Future对象。
      Future future1 = pool.submit(task1);
      // 调用get方法,一直等待任务执行完毕返回结果,然后再往下执行。
      System.out.println("task1: " + future1.get());
    } catch (Exception e) {
      System.out.println("task1: exception = " + e.getMessage());
    }
    
    // 第二个任务
    try {
      Future future2 = pool.submit(task2);
      // 休眠1秒。
      Thread.sleep(1000);
      // 取消任务的执行
      System.out.println("task2: cancel = " + future2.cancel(true));
    }
    catch (Exception e) {
      System.out.println("task2: cancel = " + e.getMessage());
    }
    
    // 第三个任务
    try {
      Future future3 = pool.submit(task3);
      // 等待1秒,超时后会抛出TimeoutException
      System.out.println("task3: " + future3.get(1, TimeUnit.SECONDS));
    } catch (Exception e) {
      System.out.println("task3: " + e.toString());
    }
    
    // 尝试停止所有正在执行的活动任务,暂停处理正在等待的任务。
    pool.shutdownNow();
  }
}

 

发表回复

您的电子邮箱地址不会被公开。