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

(0)

相关推荐

  • 简单讲解Java的Future编程模式

    用过Java并发包的朋友或许对Future (interface) 已经比较熟悉了,其实Future 本身是一种被广泛运用的并发设计模式,可在很大程度上简化需要数据流同步的并发应用开发.在一些领域语言(如Alice ML )中甚至直接于语法层面支持Future. 这里就以java.util.concurrent.Future 为例简单说一下Future的具体工作方式.Future对象本身可以看作是一个显式的引用,一个对异步处理结果的引用.由于其异步性质,在创建之初,它所引用的对象可能还并不可用(

  • java多线程返回值使用示例(callable与futuretask)

    Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,下面来看一个简单的例子 复制代码 代码如下: package com.future.test; import java.io.FileNotFoundException;import java.io.IOException;i

  • Java多线程之异步Future机制的原理和实现

    项目中经常有些任务需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?用runnable是无法实现的,我们需要用callable看下面的代码: import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurren

  • 浅析Java和Scala中的Future

    随着CPU的核数的增加,异步编程模型在并发领域中的得到了越来越多的应用,由于Scala是一门函数式语言,天然的支持异步编程模型,今天主要来看一下Java和Scala中的Futrue,带你走入异步编程的大门. Future 很多同学可能会有疑问,Futrue跟异步编程有什么关系?从Future的表面意思是未来,一个Future对象可以看出一个将来得到的结果,这就和异步执行的概念很像,你只管自己去执行,只要将最终的结果传达给我就行,线程不必一直暂停等待结果,可以在具体异步任务执行的时候去执行其他操作

  • Java8 CompletableFuture详解

    Java 8来了,是时候学一下新的东西了.Java 7和Java 6只不过是稍作修改的版本,而Java 8将会发生重大的改进.或许是Java 8太大了吧?今天我会给你彻底地解释JDK 8中的新的抽象 – CompletableFuture.众所周知,Java 8不到一年就会发布,因此这篇文章是基于JDK 8 build 88 with lambda support的.CompletableFuture extends 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任务可拿到一

  • Java利用File类创建文件的示例代码

    只需要调用该类的一个方法createNewFile(),但是在实际操作中需要注意一些事项,如判断文件是否存在,以及如何向新建文件中写入数据等. import java.io.*; public class CreateNewFile{ //该方法用于创建文件,参数分别是文件路径和文件名.文件内容,如:myfile.doc HelloJava! public void createNewFile(String fileDirectoryAndName,String fileContent){ tr

  • java Future 接口使用方法详解

    java Future 接口使用方法详解 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API的一部分,在java.util.concurrent包中.Future接口是Java线程Future模式的实现,可以来进行异步计算. Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务.期间我自己可以去做任何想做的事情.一段时间之后,我就便

  • Java多线程Callable和Future接口区别

    Runnable是执行工作的独立任务,但是不返回任何值.如果我们希望任务完成之后有返回值,可以实现Callable接口.在JavaSE5中引入的Callable是一个具有类型参数的范型,他的类型参数方法表示为方法call()而不是run()中返回的值,并且必须使用ExecutorService.submint()方法进行调用. 代码如下 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionExcep

  • Java并发教程之Callable和Future接口详解

    刚把Thread 的知识理了一遍. Runnable是一个接口,而Thread是Runnable的一个实现类. 所以也就有了之前创建线程的两种方法 继承Thread 实现Runnable 我们看一下新建线程的方法: 都是得传入一个Runnable对象(这句话很关键) 所以传入一个Runnble和Thread对象都行. 现在引入创建线程的第三种方法:Callable 为了实现 Runnable,需要实现不返回任何内容的 run()方法,而对于 Callable,需要实现在完成时返回结果的 call

  • Java 自定义错误类示例代码

    在程序中,需要抛出异常,然后在用户界面进行错误信息输出. 一种情况是在程序中最后UI显示的时候一个一个异常捕获,然后 显示对应的ErrorMessage,有时候,程序因为业务逻辑的原因需要抛出异常,就需要自定义异常. 如何将异常消息集中处理,以对应多语言话的要求 ,这些错误消息就需要集中处理了. 自定义错误消息. 复制代码 代码如下: public class MyException extends Exception{    private static final long serialVe

  • Java分页工具类及其使用(示例分享)

    Pager.java package pers.kangxu.datautils.common; import java.io.Serializable; import java.util.List; /** * * <b> 分页通用类 </b> * * @author kangxu * @param <T> * */ public class Pager<T> implements Serializable { /** * */ private stati

  • 应用程序操作NorFlash示例代码分享(norflash接口使用方法)

    复制代码 代码如下: int dealwithnor(){ //    glob_t mtdbuf;    struct mtd_info_user mtd;    struct erase_info_user erase;    int blocks = 0;    int i = 0;  //用于控制擦除的块的个数    int k = 0;    int written = 0;  //已写入的字节数,只初始化一次    unsigned int size = StateOfImage.s

  • Java实现自定义LinkedList类的示例代码

    目录 一.LinkedList和ArrayList 二.自定义LinkedList类(单向链表) 1.实现思路 2.Node结点类 3.size().isEmpty().get(int index) 4.add(Object o) 5.add(int index,Object element) 6.test类 在正式讲解怎么自定义LinkedList类之前,需要再回顾一下之前学过的一些内容,避免跟ArrayList类混淆. 一.LinkedList和ArrayList -- LinkedList

  • Java实现自定义ArrayList类的示例代码

    目录 一.总体实现思路 二.add方法 三.size方法 四.isEmpty方法 五.构造方法 六.ArrayList整体代码 七.Test测试类 之前有接触过Collection中的ArrayList类,类中提供了多种可以操作的方法,但是为什么还需要自定义ArrayList类呢?主要是为了学习其中编写程序时的逻辑思维.,今天将简单的介绍ArrayList里面的add方法.size方法.isEmpty方法. 一.总体实现思路 在自定义ArrayList类时需要提前思考多个方面的内容 1.该Arr

随机推荐