本想用FutureTask封装一个 Runnable
线程。然后几个FutureTask对象同时运行,没想到FutureTask
并不是多线程运行的。我只是想用它在线程运行结束得到其运行的结果。有别的方法吗?下面的代码有点乱,但改一下就可以知道FutureTask并不是多线程运行的。/*Thread t1=new Thread(o[0]);
Thread t2=new Thread(o[1]);//这个代码很显然是多线程的。
t1.start();
t2.start();*/
import java.util.concurrent.FutureTask;class Out  implements Runnable{
public static int var=0;
private int id;
public  int i;
public StringBuilder sb=new StringBuilder(); 
Out()
{
this.id=var;
var++;
}
public void speak()
{
for(i=0;i<=1000;i++)
System.out.println("My id is:"+id);
sb.append(i);
}
public void  run()
{
this.speak();
}

}class Fun
{
private FutureTask<StringBuilder>[] ft=new FutureTask[2];
private Out[] o=new Out[2];
public void fun()
{
for(int i=0;i<2;i++)
{
 o[i]=new Out();
 System.out.println("ok!");

}
/*for(int i=0;i<2;i++)
{
ft[i].run();
}*/
//Thread t1=new Thread(o[0]);
//Thread t2=new Thread(o[1]);
//t1.start();
//t2.start();
ft[0]=new FutureTask<StringBuilder>(o[0],o[0].sb);
ft[1]=new FutureTask<StringBuilder>(o[1],o[1].sb);
ft[0].run();
ft[1].run();
for(int i=0;i<=100;i++)
System.out.println("main:"+i);
try
{
System.out.println("out0:"+ft[0].get().toString());
System.out.println("out1:"+ft[1].get().toString());
}
catch(Exception e)
{
e.printStackTrace();
}
}
}public class MulTread
{ public static void main(String[] args)
throws Exception
{
Fun f=new Fun();
f.fun();


}

}
//谁能给个解释?

解决方案 »

  1.   

    代码没看,按你的意思,可能要用到join
      

  2.   

    是啊,我以前是用的join()。在网上有人说用FutureTask可以完成相同的效果,我也试过了。今天才发现FutureTask并不是多线程的。
      

  3.   

    FutureTask 具体是不是多线程的不太清楚。个人觉得SUN设计出来就是解决runnable向callabel转换的。应该是多线程的。你把第一个task线程sleep一下看看就知道了。
    如果只想得到运行结果。那你为什么不直接用callable呢?!!
      

  4.   

    callable就是专门设计出来解决runnable无法得知运行结果的问题的。
      

  5.   

    怎么用那?不太明白callable怎么用,文档有点看不懂。举个例子好吗?谁知道那种方法返回结果的效率最高?jion(),callable?,还是FutureTask?