转载:http://blog.csdn.net/kaiwii/article/details/6773971
import java.util.concurrent.Callable
;
import java.util.concurrent.ExecutionException ;
import java.util.concurrent.FutureTask ;
/**
*
* @author Kaiwii Ho
* Callable类就是一个有返回值的任务
* 对于任务与Thread之间的关系,可以这样子理解:
* Callable类的实例就是一个锦囊妙计;而Thread就是执行这个锦囊妙计的过程
*
* FutureTask类(Future接口的一个实现)就是一个监视器:检测着被若干个异步线程操作的变量的一个类
*
* 代码演示了主线程如何通过使用Callable类和FutureTask类,实现:
* 主线程一边等待子线程的处理结果,一边完成自己的工作。
*
*考虑以下一个小黑工kaiwii的故事……
*/
public class TestFutureTask {
/**
* @param args
*/
public static void main (String [] args ) {
// TODO Auto-generated method stub
//准备一份工作给一个打工仔employee叫Kaiwii
Employee kaiwii = new Employee ( "kaiwii" );
//新建一个监工头inspector
FutureTask <Double >inspector = new FutureTask <Double >(kaiwii );
//让kaiwii这个打工仔工作
System.out.println ( "老板发话,让kaiwii这个打工仔工作吧!" );
new Thread (inspector ).start ();
System.out.println ( "老板开始数钱!" );
//老板一边数钱,一边命令监工inspector监视Kaiwii工作;一旦kaiwii完成工作就拿来让他检查
while (!inspector.isDone ()){
System.out.println ( "老板数钱中……" );
try {
Thread.sleep ( 500) ;
} catch (InterruptedException e ) {
// TODO Auto-generated catch block
e.printStackTrace ();
}
}
//老板交监工inspector将kaiwii的结果呈上来以便他验收kaiwii计算出来的结果
try {
System.out.println ( "老板发现kaiwii的结果是:" +inspector.get ());
} catch (InterruptedException e ) {
// TODO Auto-generated catch block
e.printStackTrace ();
} catch (ExecutionException e ) {
// TODO Auto-generated catch block
e.printStackTrace ();
}
}
}
//子线程
class Employee implements Callable <Double >{
String employee_name ;
private void setEmployee_name (String employee_name ) {
this.employee_name = employee_name ;
}
public Employee (String employee_name ) {
setEmployee_name (employee_name );
}
@Override
public Double call () throws Exception {
// TODO Auto-generated method stub
System.out.println ( "工人" +employee_name + "说:我开始工作了!!!!" );
for ( int i = 1;i <= 10;i ++){
System.out.println ( "工人" +employee_name + " 第" +i + "次说:我在工作呢!!!!" );
Thread.sleep ( 1000) ;
}
System.out.println ( "工人" +employee_name + "说:我搞好了!!!!" );
return Math.random ();
}
}
import java.util.concurrent.ExecutionException ;
import java.util.concurrent.FutureTask ;
/**
*
* @author Kaiwii Ho
* Callable类就是一个有返回值的任务
* 对于任务与Thread之间的关系,可以这样子理解:
* Callable类的实例就是一个锦囊妙计;而Thread就是执行这个锦囊妙计的过程
*
* FutureTask类(Future接口的一个实现)就是一个监视器:检测着被若干个异步线程操作的变量的一个类
*
* 代码演示了主线程如何通过使用Callable类和FutureTask类,实现:
* 主线程一边等待子线程的处理结果,一边完成自己的工作。
*
*考虑以下一个小黑工kaiwii的故事……
*/
public class TestFutureTask {
/**
* @param args
*/
public static void main (String [] args ) {
// TODO Auto-generated method stub
//准备一份工作给一个打工仔employee叫Kaiwii
Employee kaiwii = new Employee ( "kaiwii" );
//新建一个监工头inspector
FutureTask <Double >inspector = new FutureTask <Double >(kaiwii );
//让kaiwii这个打工仔工作
System.out.println ( "老板发话,让kaiwii这个打工仔工作吧!" );
new Thread (inspector ).start ();
System.out.println ( "老板开始数钱!" );
//老板一边数钱,一边命令监工inspector监视Kaiwii工作;一旦kaiwii完成工作就拿来让他检查
while (!inspector.isDone ()){
System.out.println ( "老板数钱中……" );
try {
Thread.sleep ( 500) ;
} catch (InterruptedException e ) {
// TODO Auto-generated catch block
e.printStackTrace ();
}
}
//老板交监工inspector将kaiwii的结果呈上来以便他验收kaiwii计算出来的结果
try {
System.out.println ( "老板发现kaiwii的结果是:" +inspector.get ());
} catch (InterruptedException e ) {
// TODO Auto-generated catch block
e.printStackTrace ();
} catch (ExecutionException e ) {
// TODO Auto-generated catch block
e.printStackTrace ();
}
}
}
//子线程
class Employee implements Callable <Double >{
String employee_name ;
private void setEmployee_name (String employee_name ) {
this.employee_name = employee_name ;
}
public Employee (String employee_name ) {
setEmployee_name (employee_name );
}
@Override
public Double call () throws Exception {
// TODO Auto-generated method stub
System.out.println ( "工人" +employee_name + "说:我开始工作了!!!!" );
for ( int i = 1;i <= 10;i ++){
System.out.println ( "工人" +employee_name + " 第" +i + "次说:我在工作呢!!!!" );
Thread.sleep ( 1000) ;
}
System.out.println ( "工人" +employee_name + "说:我搞好了!!!!" );
return Math.random ();
}
}
console显示结果:
老板发话,让kaiwii这个打工仔工作吧!
老板开始数钱!
工人kaiwii说:我开始工作了!!!!
工人kaiwii 第1次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第2次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
老板数钱中……
工人kaiwii 第3次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第4次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第5次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第6次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第7次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第8次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第9次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第10次说:我在工作呢!!!!
老板数钱中……
工人kaiwii说:我搞好了!!!!
老板数钱中……
老板发现kaiwii的结果是:0.5295364482450889