文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在Java中如何使用Callable、Future进行并行编程

2023-05-30 19:12

关注

这篇文章将为大家详细讲解有关在Java中如何使用Callable、Future进行并行编程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

使用Callable、Future进行并行编程

在Java中进行并行编程最常用的方式是继承Thread类或者实现Runnable接口。这两种方式的缺点是在任务完成后无法直接获取执行结果,必须通过共享变量或线程间通信,使用起来很不方便。

从Java1.5开始提供了Callable和Future两个接口,通过使用它们可以在任务执行完毕后得到执行结果。

下面我们来学习下如何使用Callable、Future和FutureTask。

Callable接口

Callable接口位于java.util.concurrent包,这是一个泛型接口,里面只声明了一个call()方法:

public interface Callable<T> {  T call() throws Exception;}

一般配合ExecutorService接口来使用它,在ExecutorService接口中声明了几个重载的submit方法:

<T> Future<T> submit(Callable<T> task);<T> Future<T> submit(Runnable task, T result);Future<?> submit(Runnable task);

第一个submit方法里面的参数类型就是Callable,另外两个本文暂时不涉及。

Future和FutureTask

Future接口的实现类可以对Runnable或者Callable的任务执行取消、查询、获取结果的操作。

Future接口也位于java.util.concurrent包下:

public interface Future<T> {    boolean cancel(boolean mayInterruptIfRunning);    boolean isCancelled();    boolean isDone();    T get() throws InterruptedException, ExecutionException;    T get(long timeout, TimeUnit unit)    throws InterruptedException, ExecutionException, TimeoutException;}

总结下来Future提供了三种功能:

判断任务是否完成能够中断任务能够获取任务执行的结果

JDK中为我们提供了一个Future接口的实现类FutureTask,它有如下两个构造函数。

public FutureTask(Callable<T> callable) {}public FutureTask(Runnable runnable, T result) {}

示例代码

使用Callable、Future

import java.util.concurrent.*;public class Test {  public static void main(String[] args) {    ExecutorService executorService = Executors.newCachedThreadPool();    Task task = new Task();    Future<Integer> future = executorService.submit(task);    executorService.shutdown();        System.out.println("主线程在执行任务...");    try {      Thread.sleep(2000);    } catch(InterruptedException ex) {      ex.printStackTrace();    }         try {      System.out.println("task运行结果:"+future.get());    } catch (InterruptedException ex) {      ex.printStackTrace();    } catch (ExecutionException ex) {      ex.printStackTrace();    }     System.out.println("所有任务执行完毕");  }}class Task implements Callable<Integer>{  @Override  public Integer call() throws Exception {    System.out.println("子线程在执行任务...");    //模拟任务耗时    Thread.sleep(5000);    return 1000;  }}

执行结果:

子线程在执行任务...主线程在执行任务...task运行结果:1000所有任务执行完毕

使用Callable、FutureTask

import java.util.concurrent.*;public class Test {  public static void main(String[] args) {    ExecutorService executorService = Executors.newCachedThreadPool();    Task task = new Task();    FutureTask<Integer> futureTask = new FutureTask<Integer>(task);    executorService.submit(futureTask);    executorService.shutdown();        System.out.println("主线程在执行任务...");    try {      Thread.sleep(2000);    } catch (InterruptedException ex) {      ex.printStackTrace();    }         try {      System.out.println("task运行结果:"+futureTask.get());    } catch (InterruptedException ex) {      ex.printStackTrace();    } catch (ExecutionException ex) {      ex.printStackTrace();    }         System.out.println("所有任务执行完毕");  }}class Task implements Callable<Integer>{  @Override  public Integer call() throws Exception {    System.out.println("子线程在执行任务...");    //模拟任务耗时    Thread.sleep(5000);    return 1000;  }}

执行结果:

子线程在执行任务...主线程在执行任务...task运行结果:1000所有任务执行完毕

关于“在Java中如何使用Callable、Future进行并行编程”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯