Callable,Future,FutureTask
public interface Callable<V>{
V call() throws Exception;
} public interface Runnable{
void run();
}
public interface Future<V> {
   boolean cancel(boolean mayInterruptIfRunning);
   boolean isCancelled();
   boolean isDone();
   V get() throws InterruptedException, ExecutionException;
   V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}
//创建FutureTask对象,传入Callable对象;Callable对象,耗时操作是放在call方法里面的
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class FutureTaskExample { public static void main(String[] args) { Callable<String> worker = new Callable<String>() { @Override
public String call() throws Exception {
// TODO Auto-generated method stub
System.out.println("do computation");
return "computation result";
}
} ; FutureTask<String> future = new FutureTask<String>(worker) {
@Override
protected void done() { System.out.println("Done task");
}
}; new Thread(future) { @Override
public void run() {
future.run();
} }.start(); try {
System.out.println("computation:"+future.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
调用FutureTask的run方法就触发执行,可以查看FutureTask的源码得到解释:调用run,会导致调用sync.innerRun();而innerRun会调用传入的Callable对象的call方法:
public class FutureTask<V> implements RunnableFuture<V> {
    public FutureTask(Callable<V> callable) {
        if (callable == null)
            throw new NullPointerException();
        sync = new Sync(callable);
    }
.....
    // The following (duplicated) doc comment can be removed once
    //
    // 6270645: Javadoc comments should be inherited from most derived
    //          superinterface or superclass
    // is fixed.
    /**
     * Sets this Future to the result of its computation
     * unless it has been cancelled.
     */
    public void run() {
        sync.innerRun();
    }
    /**
     * Synchronization control for FutureTask. Note that this must be
     * a non-static inner class in order to invoke the protected
     * <tt>done</tt> method. For clarity, all inner class support
     * methods are same as outer, prefixed with "inner".
     *
     * Uses AQS sync state to represent run status
     */
    private final class Sync extends AbstractQueuedSynchronizer {
           void innerRun() {
            if (!compareAndSetState(READY, RUNNING))
                return;
            runner = Thread.currentThread();
            if (getState() == RUNNING) { // recheck after setting thread
                V result;
                try {
                    result = callable.call();
                } catch (Throwable ex) {
                    setException(ex);
                    return;
                }
                set(result);
            } else {
                releaseShared(0); // cancel
            }
        }
    }
}
2.实现例子
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class FutureTaskExample { public static void main(String[] args) { Callable<String> worker = new Callable<String>() { @Override
public String call() throws Exception {
// TODO Auto-generated method stub
System.out.println("do computation");
return "computation result";
}
} ; FutureTask<String> future = new FutureTask<String>(worker) {
@Override
protected void done() { System.out.println("Done task");
}
}; new Thread(future) { @Override
public void run() {
future.run();
} }.start(); try {
System.out.println("computation:"+future.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.总结
Callable,Future,FutureTask的更多相关文章
- Java 并发编程——Callable+Future+FutureTask
		Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ... 
- 12 Callable & Future & FutureTask
		创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用 ... 
- java 并发runable,callable,future,futureTask
		转载自:http://www.cnblogs.com/dolphin0520/p/3949310.html package future_call; import java.util.concurre ... 
- Java多线程:Callable,Future,FutureTask
		一.Future Future和Callable基本是成对出现的,Callable负责产生结果,Future负责获取结果. 1.Callable接口类似于Runnable,只是Runnable ... 
- java callable future futuretask
		Runnbale封装一个异步运行的任务,可以把它想象成一个没有任何参数和返回值的异步方法.Callable和Runnable相似,但是它有返回值.Callable接口是参数化的类型,只有一个方法cal ... 
- Callable, Runnable, Future, FutureTask
		Java并发编程之Callable, Runnable, Future, FutureTask Java中存在Callable, Runnable, Future, FutureTask这几个与线程相 ... 
- Future、Callable 、FutureTask详解
		1.Future和Callable Future是一个接口表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果.Future提供了get().cancel().isC ... 
- Java并发编程:ThreadPoolExecutor + Callable + Future(FutureTask) 探知线程的执行状况
		如题 (总结要点) 使用ThreadPoolExecutor来创建线程,使用Callable + Future 来执行并探知线程执行情况: V get (long timeout, TimeUnit ... 
- paip.java 多线程参数以及返回值Future FutureTask 的使用.
		paip.java 多线程参数以及返回值Future FutureTask 的使用. 在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是vo ... 
随机推荐
- 配置docker的私有仓库
			1:安装docker-registry包 yum install -y docker-distribution 2:启动docker-distribution,默认监听于TCP/5000端口 sy ... 
- 关于SVM数学细节逻辑的个人理解(二):从基本形式转化为对偶问题
			第二部分:转化为对偶问题进一步简化 这一部分涉及的数学原理特别多.如果有逻辑错误希望可以指出来. 上一部分得到了最大间隔分类器的基本形式: 其中i=1,2,3...m 直接求的话一看就很复杂,我们 ... 
- python读取文件解码失败
			python2.7 urllib2 抓取新浪乱码 中的: 报错的异常是 UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2 ... 
- MYSQLD_OPTS修改
			systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"; 
- CentOS下Neo4j安装教程
			本文记录一下在CentOS 6.7上,安装neo4j图数据库,本文安装的版本为neo4j-community-2.3.9-unix.tar.gz. 下载Neo4j安装包 使用wget命令获取Neo4j ... 
- 如何实现MySQL表数据随机读取?从mysql表中读取随机数据
			文章转自 http://blog.efbase.org/2006/10/16/244/如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysql ... 
- Oracle 默认的driectory 目录
			1. 写导出命令忘记加directory参数了.. 查了一下: select directory_path from all_directories c:\cwdata\ C:\app\Adminis ... 
- Qt Lighthouse学习(二),就是QPA(Qt Platform Abstraction) 项目的名字
			上一次关注Qt Lighthouse是在6月初,可是现在都8月底了.时间真快... Lighthouse 是 QPA(Qt Platform Abstraction) 项目的名字,它使得将Qt移植到新 ... 
- QVariant相当于一个包含大多数Qt数据类型的联合体(源码解读)
			将数据存储为一个Private结构体类型的成员变量d: <qvariant.cpp> 1 QVariant::QVariant(Type type) 2 { create(type, 0) ... 
- Redis (二)_ jedis的使用
			Jedis 是 Redis 官方首选的 Java 客户端开发包 虚拟机设置 查看虚拟机的ip ifconfig 将虚拟机的6379端口打开 #运行下面的命令 如果是新建的一个新的 文件,你需要先安装 ... 
