Java Callable的使用

  Callable<>和Runable类似,都是用于Java的并发执行。

  唯一的区别是,Runable的run方法的返回是void,而Callable的call方法是有返回值的。

  call方法返回的类型是实现Callable<?>泛型接口时所指定的类型,不然会编译出错。

  那么,怎样获取call方法的返回值呢?——通过执行Callable,可以返回的Future对象,通过调用future对象的get方法来获取call方法的返回值。

  综上,你把Callable当成是有返回值的Runable就行了,只不过Callable的是call,Runable的是run。

  下面是演示代码:

 1 import java.util.ArrayList;
 2 import java.util.concurrent.Callable;
 3 import java.util.concurrent.ExecutionException;
 4 import java.util.concurrent.ExecutorService;
 5 import java.util.concurrent.Executors;
 6 import java.util.concurrent.Future;
 7
 8
 9 public class CallableTest{
10     public static void main(String[] args) {
11         ExecutorService executorService=    //创建线程池
12                 Executors.newCachedThreadPool();
13         ArrayList<Future<String>> list=
14                 new ArrayList<Future<String>>();
15         for (int i = 0; i < 10; i++) {
16             list.add(executorService    //通过submit方法来提交Callable到线程池中执行
17                     .submit(new TaskWithResult()));
18         }
19         for (Future<String> future : list) {
20             try {
21                 System.out.println(future.get()); //通过get方法来获取call返回值
22             } catch (InterruptedException e) {
23                 e.printStackTrace();
24             } catch (ExecutionException e) {
25                 e.printStackTrace();
26             }
27         }
28     }
29
30
31     static class TaskWithResult implements Callable<String>{
32         private static int taskNum=0;
33         private int taskId=taskNum;
34         public TaskWithResult() {
35             taskNum++;
36         }
37
38         @Override
39         public String call() throws Exception {
40             try {
41                 Thread.sleep(this.taskId*1000);    //我制造的时间差,更直观地显示call和run方法的相似性。
42             } catch (InterruptedException e) {
43                 e.printStackTrace();
44             }
45             return "Result of TaskWithResult: "+this.taskId;
46         }
47
48     }
49
50 }

  运行结果:

  Result of TaskWithResult: 0
  Result of TaskWithResult: 1
  Result of TaskWithResult: 2
  Result of TaskWithResult: 3
  Result of TaskWithResult: 4
  Result of TaskWithResult: 5
  Result of TaskWithResult: 6
  Result of TaskWithResult: 7
  Result of TaskWithResult: 8
  Result of TaskWithResult: 9

  以上的运行结果是每隔一秒打印一行的,这说明,call和run是差不多的。

  

时间: 2024-08-06 11:45:02

Java Callable的使用的相关文章

基于java callable及future接口解决生产者消费者问题

这两天复习java线程时,把java里面的线程基本知识点与jdk1.5以后新添加的一些类的使用都了解了一下,借用生产者消费者的问题来将他们实践一下. 题目:(题目在csdn一大牛的空间找的) 生产者-消费者模式,这个食堂中只有1张桌子,同时最多放10个盘子,现在有4个厨师做菜,每做好一盘就往桌子上放(生产者将产品往仓库中放),而有6个食客不停地吃(消费者消费产品,为了说明问题,他们的食量是无的).一般而言,厨师200-400ms做出一盘菜,而食客要400-600ms吃完一盘.当桌子上放满了10个

Java Callable and Future

package concurrency.callable; import java.util.concurrent.Callable; /** * <pre> * Callable 与 Future 是为了适应 jdk1.6多并发产生的 * Callable 与 Runnable接口 * 共同 : * 1.都是一种任务,被其他线程调度的任务 * 区别 : * 1.Callable 用的是Call ,Runnable用的是run * 2.call可以throw Excepiton ,run 不行

java Callable

package concurrency; import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Fut

Java Callable并发编程模板

submit方法会产生Future对象,它用Callable返回结果的特定类型进行了参数化,可以用isDone()的方法来查询Future是否已经完成.当任务完成是,它具有一个结果,可以调用get()方法来获取该结果. /** * @Title: TaskWithResult.java * @Package zeze * @Description: TODO(用一句话描述该文件做什么) * @author A18ccms A18ccms_gmail_com * @date 2017年2月8日 上

Java Callable接口——有返回值的线程

实际开发过程中,我们常常需要等待一批线程都返回结果后,才能继续执行.<线程等待--CountDownLatch使用>中我们介绍了CountDownLatch的使用,通过使用CountDownLatch,可以实现线程等待. JDK 1.8实现了一种更好的方式,实现线程等待与获取线程返回值,那就是Callable接口,下面我们来看看具体代码. package com.coshaho.learn; import java.util.Random; import java.util.concurren

Java Callable接口、Runable接口、Future接口

1. Callable与Runable区别 Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理.Thread类.Runnable接口和Java内存管理模型使得多线程编程简单直接. 但Thread类和Runnable接口都不允许声明检查型异常,也不能定义返回值.没有返回值这点稍微有点麻烦.不能声明抛出检查型异常则更麻烦一些. public void run()方法契约意味着你必须捕获并处理检查型异常.即使你小心地保存了异常信息(在捕获异常时)以便稍后检查,但也

Java Callable和Future简述

创建线程的两种方式,一种是直接继承Thread,另外一种就是实现Runnable接口.这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果.如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦.而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. 一.Runnable接口 先看一下java.lang.Runnable吧,它是一个接口,在它里面只声明了一个run()方法: publi

Java Callable使用

1. 创建线程的三种方式: 继承Thread,重写run方法 实现Runnable接口,重新run方法 实现Callable接口,重写call方法 2. Callable接口实际上是属于Executor框架中的功能类,Callable接口与Runnable接口的功能类似,但提供了比Runnable更加强大的功能. Callable可以在任务结束的时候提供一个返回值,Runnable无法提供这个功能 Callable的call方法分可以抛出异常,而Runnable的run方法不能抛出异常. 3.

Java Callable,Runnable比较及用法

Runnable和Callable的区别是,(1)Callable规定的方法是call(),Runnable规定的方法是run().(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值.(3)call方法可以抛出异常,run方法不可以.(4)运行Callable任务可以拿到一个Future对象, Future 表示异步计算的结果.它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果.计算完成后只能使用 get 方法来获取结果, 如果线程没有执行完,Fut