java自定义任务类定时执行任务示例 callable和future接口使用方法

 更新时间:2014年01月16日 09:46:27   作者:  
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务

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();
 }
}

相关文章

  • Eclipse配置springIDE插件的方法步骤

    Eclipse配置springIDE插件的方法步骤

    本篇文章主要介绍了Eclipse配置springIDE插件的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Mybatis-plus通过添加拦截器实现简单数据权限

    Mybatis-plus通过添加拦截器实现简单数据权限

    系统需要根据用户所属的公司,来做一下数据权限控制,具体一点,就是通过表中的company_id进行权限控制,项目使用的是mybatis-plus,所以通过添加拦截器的方式,修改查询sql,实现数据权限,本文就通过代码给大家详细的讲解一下,需要的朋友可以参考下
    2023-08-08
  • Java使用正则表达式验证手机号和电话号码的方法

    Java使用正则表达式验证手机号和电话号码的方法

    今天小编就为大家分享一篇关于Java使用正则表达式验证手机号和电话号码的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Java中的反射机制详解

    Java中的反射机制详解

    这篇文章主要介绍了JAVA 反射机制的相关知识,文中讲解的非常细致,代码帮助大家更好的理解学习,感兴趣的朋友可以了解下
    2021-09-09
  • Java手动实现Redis的LRU缓存机制

    Java手动实现Redis的LRU缓存机制

    在Java中LRU的实现方式是使用HashMap结合双向链表,HashMap的值是双向链表的节点,双向链表的节点也保存一份key value。
    2021-05-05
  • RabbitMQ消息的延迟队列详解

    RabbitMQ消息的延迟队列详解

    这篇文章主要介绍了RabbitMQ消息的延迟队列,延迟队列也就是死信交换机,有些队列的消息成为死信后,消息中间件可以将其从当前队列发送到另一个队列中,这个队列就是死信队列,感兴趣的同学可以参考下文
    2024-02-02
  • Java中instance的用法详解

    Java中instance的用法详解

    这篇文章主要介绍了Java中instance的用法详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • SpringBoot项目整合mybatis的方法步骤与实例

    SpringBoot项目整合mybatis的方法步骤与实例

    今天小编就为大家分享一篇关于SpringBoot项目整合mybatis的方法步骤与实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • SpringBoot使用MyBatis-Flex实现灵活的数据库访问

    SpringBoot使用MyBatis-Flex实现灵活的数据库访问

    MyBatisFlex是一款优秀的持久层框架,本文主要介绍了SpringBoot使用MyBatis-Flex实现灵活的数据库访问,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Spring Boot 3.x 全新的热部署配置方式详解(IntelliJ IDEA 2023.1)

    Spring Boot 3.x 全新的热部署配置方式详解(IntelliJ ID

    这篇文章主要介绍了Spring Boot 3.x 全新的热部署配置方式(IntelliJ IDEA 2023.1),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07

最新评论