码迷,mamicode.com
首页 > 编程语言 > 详细

Java多线程 - Callable和Future

时间:2014-12-03 00:07:58      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   使用   sp   java   for   

已知的创建多线程的方法有继承Tread类和实现Runnable方法。此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体。但是call()方法与run()方法有些不同:

  • call()方法可以有返回值
  • call()方法可以抛出异常

不过Java不允许Callable对象直接作为Thread的target。而且call()方法还有一个返回值——call()方法并不是直接调用,他是做为线程执行体被调用的。Java提供了Future接口来代表Callable接口里call()方法的返回值,并为Future接口提供了一个FutureTask实现类,该实现类实现了Future接口,并实现了Runnable接口,因此可以将之作为Thread的target。

使用Callable和Future创建线程的步骤如下:

创建Callable接口的实现类,并实现call方法;

创建Callable接口实现类的实例,使用FutureTask类来包装Callable对象;

使用FutureTask对象作为Thread对象的target创建并启动新线程;

调用FutureTask对象的方法来获得子线程执行结束后的返回值。

附上实现代码:

package net.ibuluo.hunter;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

class MyThread implements Callable<String>{
    public String call() throws Exception {
        for(int i=0; i<20; i++){
            System.out.println(Thread.currentThread().getName() + " ---- " + i);
        }
        return "This is a Test!";
    }
}

public class Test {
    public static void main(String[] args) {
        
        MyThread mt = new MyThread();
        FutureTask<String> ft = new FutureTask<String>(mt);
        for(int i=0; i<20; i++){
            System.out.println(Thread.currentThread().getName() + " ---- " + i);
            if(i==10){
                new Thread(ft, "子线程1").start();
            }
        }
        
        try{
            System.out.println("子线程返回值:" + ft.get());
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

Java多线程 - Callable和Future

标签:style   blog   io   ar   color   使用   sp   java   for   

原文地址:http://www.cnblogs.com/amunote/p/4138894.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!