多线程08-Callable和Future

1.简介

Callable是一个接口,与Runnable类似,包含一个必须实现的call方法,可以启动为让另一个线程来执行,执行Callable可以得到一个Future对象 该对象可以监听Callable的执行结果 也可以取消该任务的执行

2.案例

package org.lkl.thead.foo;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableAndFuture {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
      ExecutorService threadPool =   Executors.newSingleThreadExecutor() ;
      Future<String> future =  threadPool.submit(new Callable<String>() {
        @Override
        public String call() throws Exception {
            System.out.println("call method");
            Thread.sleep(100) ;
            return "liaokailin";
        }
    }) ;
     System.out.println(" future.isCancelled():"+ future.isCancelled()); ;
     while(!future.isDone()){
         System.out.println("---等待结果---");
     }
   //   future.cancel(true) ;
      System.out.println(future.get() );;
    }
}

通过threadPool.submit可以返回一个Future对象 ,通过该对象的 future.isDone 表示Callable中的任务是否执行完成  true表示完成

future.cancle(true) 可以取消Callable中的任务(call)

future.get() 得到的是Callable中call方法的返回值.

注意 代码执行到future.get()的时候会等待Callable中的call方法执行 等待执行结束以后get()方法才会执行完成 ,否则一直在等待call的执行   也可以通过 future.get(timeout, unit)

方法来设置等待几秒以后获取call的返回值 如果没有获取到结果则返回异常.

3. CompletionService

通过CompletionService可以处理一组Callable任务 ,通过其take方法可以获得Future对象

    ExecutorService threadPool =  Executors.newFixedThreadPool(10) ;
        CompletionService<Integer> service = new ExecutorCompletionService<Integer>(threadPool) ;

        for(int i =1 ;i<=10;i++){
            final int flag = i ;
            service.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    Thread.sleep(new Random().nextInt(1000)) ;
                    return flag;
                }
            }) ;
        }

        for(int i =1 ;i<=10;i++){
            Future<Integer> future = service.take() ;
            System.out.println(future.get() );

        }

结果:

8
1
5
3
2
10
6
4
9
7

  执行的结果是无序的 那么说明CompletionService获得Callable的结果是 看哪个Callable先执行完成则先获得其返回的结果

如果将上面的 ExecutorService threadPool =  Executors.newFixedThreadPool(10) ; 方法换成:

ExecutorService threadPool =  Executors.newSingleThreadExecutor() ;

则执行的结果是从1-10有序的

那是因为当前线程池中只有一个线程  要等待for循环的第一次执行完才会去执行第二次的for循环.

多线程08-Callable和Future

时间: 2024-11-02 11:39:35

多线程08-Callable和Future的相关文章

Java多线程知识-Callable和Future

Callable和Future出现的原因 创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. Callable和Future介绍 Callable接口代表一段可以调用并返回结果的代码

Java多线程21:多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask

CyclicBarrier 接着讲多线程下的其他组件,第一个要讲的就是CyclicBarrier.CyclicBarrier从字面理解是指循环屏障,它可以协同多个线程,让多个线程在这个屏障前等待,直到所有线程都达到了这个屏障时,再一起继续执行后面的动作.看一下CyclicBarrier的使用实例: public static class CyclicBarrierThread extends Thread { private CyclicBarrier cb; private int sleep

Java多线程 - Callable和Future

已知的创建多线程的方法有继承Tread类和实现Runnable方法.此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体.但是call()方法与run()方法有些不同: call()方法可以有返回值 call()方法可以抛出异常 不过Java不允许Callable对象直接作为Thread的target.而且call()方法还有一个返回值--call()方法并不是直接调用,他是做为线程执行体被调用的.Java提供了Future接口来代表Call

Android进阶——多线程系列之Thread、Runnable、Callable、Future、FutureTask

多线程系列之Thread.Runnable.Callable.Future.FutureTask 前言 多线程一直是初学者最抵触的东西,如果你想进阶的话,那必须闯过这道难关,特别是多线程中Thread.Runnable.Callable.Future.FutureTask这几个类往往是初学者容易搞混的.这里先总结这几个类特点和区别,让大家带着模糊印象来学习这篇文章 Thread.Runnable.Callable:都是线程 Thread特点:提供了线程等待.线程睡眠.线程礼让等操作 Runnab

Callable和Future实现多线程

Callable和Future实现多线程    Future取得的结构类型和Callable返回的结果类型必须一致. Callable要采用ExecutorService的submit方法提交,返回的future对象可以取消任务 1.提交任务,得到任务的返回结果举例 ExecutorService threadPool = Executors.newSingleThreadExecutor(); Future<String> future = threadPool.submit(new Cal

java多线程技术之(callable和future)

接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果. Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,下面来看一个简单的例子: 1 public class CallableAndFuture { 2 publ

Java多线程系列--“JUC线程池”06之 Callable和Future

概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544116.html Callable 和 Future 简介 Callable 和 Future 是比较有趣的一对组合.当我们需要获取线程的执行结果时,就需要用到它们.Callable用于产生结果,Future用于获取结果. 1. Callable Calla

多线程-Thread,Runnable,Callable,Future,RunnableFuture,FutureTask

类图: 先看各自的源码: public interface Runnable { public abstract void run(); } public class Thread implements Runnable { /* What will be run. */ private Runnable target; } Thread与Runnable其实是一个装饰器模式. public interface Callable<V> { V call() throws Exception;

Java多线程编程:Callable、Future和FutureTask浅析

通过前面几篇的学习,我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结果该如何实现呢?还记上一篇Executor框架结构中提到的Callable接口和Future接口吗?,是的,从Java SE 5.0开始引入了Callable和Future,通过它们构建的线程,在任务执行完成后就可以获取执行结果,今天我们就来聊聊线程创建的第三种方式,那就是实现Callable接口.

Java多线程——Callable与Future

二月份回家过年了,家里没网,所以博客也停了一段时间,上班已经一周了,总的来说还是比较忙吧!周末还是把没总结完的知识点总结一下,方便日后翻阅! Callable与Future Runnable封装一个异步运行的任务,可以把它想象成一个没有参数和返回值的异步方法.Callable与Runnable类似,但是有返回值.Callable接口是一个参数化的类型,只有一个方法call. public interface Callable<V>{ V call() throws Exception; } 类