java futuretask_Java FutureTask示例

Java Callable Future接口可用来获得线程的并发处理优势,以及它们能够为调用程序返回值。

FutureTask是Future接口的基本具体实现,并提供异步处理。它包含启动和取消任务的方法,以及可以返回FutureTask状态的方法,无论它是完成还是取消。需要一个可调用的对象来创建未来的任务,然后我们可以使用Java线程池执行器来异步处理它们。

下面来看一下使用简单的FutureTask示例程序。

由于FutureTask需要一个可调用的对象,将创建一个简单的Callable实现。

import java.util.concurrent.Callable;

public class MyCallable implements Callable {

private long waitTime;

public MyCallable(int timeInMillis){

this.waitTime=timeInMillis;

}

@Override

public String call() throws Exception {

Thread.sleep(waitTime);

//return the thread name executing this callable task

return Thread.currentThread().getName();

}

}

下面是FutureTask方法的一个示例,它显示了FutureTask的常用方法。

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.FutureTask;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.TimeoutException;

public class FutureTaskExample {

public static void main(String[] args) {

MyCallable callable1 = new MyCallable(1000);

MyCallable callable2 = new MyCallable(2000);

FutureTask futureTask1 = new FutureTask(callable1);

FutureTask futureTask2 = new FutureTask(callable2);

ExecutorService executor = Executors.newFixedThreadPool(2);

executor.execute(futureTask1);

executor.execute(futureTask2);

while (true) {

try {

if(futureTask1.isDone() && futureTask2.isDone()){

System.out.println("Done");

//shut down executor service

executor.shutdown();

return;

}

if(!futureTask1.isDone()){

//wait indefinitely for future task to complete

System.out.println("FutureTask1 output="+futureTask1.get());

}

System.out.println("Waiting for FutureTask2 to complete");

String s = futureTask2.get(200L, TimeUnit.MILLISECONDS);

if(s !=null){

System.out.println("FutureTask2 output="+s);

}

} catch (InterruptedException | ExecutionException e) {

e.printStackTrace();

}catch(TimeoutException e){

//do nothing

}

}

}

}

当运行上面的程序时,它不会打印任何东西,因为FutureTask的get()方法等待任务完成然后返回输出对象。还有一个重载方法也只等待指定的时间,我们将它用于futureTask2。还要注意使用isDone()方法确保程序在执行完所有任务后终止。

上述程序的输出将是:

FutureTask1 output=pool-1-thread-1

Waiting for FutureTask2 to complete

Waiting for FutureTask2 to complete

Waiting for FutureTask2 to complete

Waiting for FutureTask2 to complete

Waiting for FutureTask2 to complete

FutureTask2 output=pool-1-thread-2

Done

因此,FutureTask没有任何好处,但是当我们想要覆盖一些Future接口方法并且不想实现Future接口的每个方法时,它会派上用场。

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值