为什么task2无法完成呢?
import java.util.concurrent.Callable;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
import java.util.concurrent.Future;  
  
public class FutureExample {  
      
    public static void main(String[] args) throws Exception {  
        ExecutorService executor = Executors.newCachedThreadPool();  
        Runnable task1 = new Runnable() {  
            @Override  
            public void run() {  
                //do something  
                System.out.println("i am task1.....");  
            }  
 };  
 Callable<Integer> task2 = new Callable<Integer>() {  
     @Override  
     public Integer call() throws Exception {  
         //do something  
         return new Integer(100);  
     }  
 };  
 Future<?> f1 = executor.submit(task1);  
 Future<Integer> f2 = executor.submit(task2);  
 System.out.println("task1 is completed? " + f1.isDone());  
 System.out.println("task2 is completed? " + f2.isDone());  
 //waiting task1 completed          while(f1.isDone()){  
            System.out.println("task1 completed.");  
            break;  
        }  
        //waiting task2 completed  
        while(f2.isDone()){  
            System.out.println("return value by task2: " + f2.get());  
            break;  
        }  
    }  
  
}  结果:
i am task1.....
task1 is completed? true
task2 is completed? false
task1 completed.

解决方案 »

  1.   

    JDK 1.7,Eclipse Luna么有问题
      

  2.   

    在你做输出之前加上一句Thread.sleep(5000);试试吧。
    所谓的并发,就是无论线程是否完成,主线程都不会等待,主线程动作够快的话你连task1都完成不了。
      

  3.   

    还真是这样,加了一个Thread.sleep(500);
    import java.util.concurrent.Callable;  
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
    import java.util.concurrent.Future;  
      
    public class FutureExample {  
          
        public static void main(String[] args) throws Exception {  
            ExecutorService executor = Executors.newCachedThreadPool();  
            Runnable task1 = new Runnable() {  
                @Override  
                public void run() {  
                    //do something  
                    System.out.println("i am task1.....");  
                }  
     };  
     Callable<Integer> task2 = new Callable<Integer>() {  
         @Override  
         public Integer call() throws Exception {  
          System.out.println("i am task2.....");    
             return new Integer(100);  
         }  
     };  
     
     Future<?> f1 = executor.submit(task1); 
     Future<Integer> f2 = executor.submit(task2); 
      
      Thread.sleep(500);
     System.out.println("task1 is completed? " + f1.isDone());  
     System.out.println("task2 is completed? " + f2.isDone());  
     //waiting task1 completed          while(f1.isDone()){  
                System.out.println("task1 completed.");  
                break;  
            }  
            //waiting task2 completed  
            while(f2.isDone()){  
                System.out.println("return value by task2: " + f2.get());  
                break;  
            }  
        }  
      
    }  然后输出:
    i am task1.....
    i am task2.....
    task1 is completed? true
    task2 is completed? true
    task1 completed.
    return value by task2: 100
      

  4.   

    然后又改了一下,一样得到同样的结果
    import java.util.concurrent.Callable;  
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
    import java.util.concurrent.Future;  
      
    public class FutureExample {  
          
        public static void main(String[] args) throws Exception {  
            ExecutorService executor = Executors.newCachedThreadPool();  
            Runnable task1 = new Runnable() {  
                @Override  
                public void run() {  
                    //do something  
                    System.out.println("i am task1.....");  
                }  
     };  
     Callable<Integer> task2 = new Callable<Integer>() {  
         @Override  
         public Integer call() throws Exception {  
          System.out.println("i am task2.....");    
             return new Integer(100);  
         }  
     };  
     
     Future<?> f1 = executor.submit(task1); 
     Future<Integer> f2 = executor.submit(task2); 
      
     //Thread.sleep(500);
     while(!(f1.isDone()&&f2.isDone())){
     //System.out.println("task1 is completed? " + f1.isDone());  
     //System.out.println("task2 is completed? " + f2.isDone());  
     }        while(f1.isDone()){  
                System.out.println("task1 completed.");  
                break;  
            }  
            //waiting task2 completed  
            while(f2.isDone()){  
              System.out.println("task2 completed.");  
                System.out.println("return value by task2: " + f2.get());  
                break;  
            }  
        }  
      
    }  i am task1.....
    i am task2.....
    task1 completed.
    task2 completed.
    return value by task2: 100