注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 35岁技术人遭遇年龄坎儿,..
 帮助

Java:使用Callable建立线程


2008-04-07 11:37:44
 标签:Java 线程 Callable   [推送到博客圈]

版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。
Runnable接口定义的run()方法不返回任何值(void),如果希望线程任务执行完返回值,可使用Callable接口。
1.Callable 接口
<<interface>>Callable.java
package java.util.concurrent;
public interface Callable<V> {
    V call() throws Exception;
}
具体的使用类似于Runnable接口,只不过一个是override run()方法,一个是orverride call()方法。
2.应用过程分析
首先,使用类Exectors创建一个线程池。返回的实例通过接口ExectorServicesubmit方法提交线程。它会将所有的返回结果存储为Future接口的实例。
 
2.1 ExectorService.submit()方法
-<T> Future<T> submit(Callable<T> task)
提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。该 Future get 方法在成功完成时将会返回该任务的结果。
-参数: task - 要提交的任务
-返回: 表示任务等待完成的 Future
 
2.2 Future 接口
-public interface Future<V>
Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。
3.应用实例
下面的线程实现Callable接口,每次返回一个String,表示线程运行结束。
MyThread.java
package com.zj.concurrency.callable;
 
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.Future;
 
public class MyThread implements Callable<String> {
    private int count = 1, number;
 
    public MyThread(int num) {
       number = num;
       System.out.println("Create Thread-" + number);
    }
 
    public String call() {
       while (true)
           if (++count == 6)
              return "Thread-" + number + " finish";
    }
 
    public static void main(String[] args) {
       ExecutorService exec = Executors.newCachedThreadPool();
       ArrayList<Future<String>> results = new ArrayList<Future<String>>();
       for (int i = 0; i < 5; i++)
           results.add(exec.submit(new MyThread(i)));
       for (Future<String> fs : results)
           try {
              // get() blocks until completion:
              System.out.println(fs.get());
           } catch (InterruptedException e) {
              System.out.println(e);
              return;
           } catch (ExecutionException e) {
              System.out.println(e);
           } finally {
              exec.shutdown();
           }
    }
}
结果:
Create Thread-0
Create Thread-1
Create Thread-2
Create Thread-3
Create Thread-4
Thread-0 finish
Thread-1 finish
Thread-2 finish
Thread-3 finish
Thread-4 finish

本文出自 “子 孑” 博客,转载请与作者联系!


附件下载:
  MyThread.java




    文章评论
 
 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: