`

通过Callable获取线程的执行结果

阅读更多
在现实生活中,我们执行线程时一般需要获取线程的结果,这时我们可以通过Callable来实现我们的需求,代码如下



import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class MyCallable implements Callable<String> {

	  private int flag = 0; 

      public MyCallable(int flag){

              this.flag = flag;

      }

	@Override
	public String call() throws Exception {
		// TODO Auto-generated method stub
		
		//==0 直接返回
		if (this.flag == 0)
		{  
		  return "flag = 0";
        } 
       
		//=1 死循环
       if (this.flag == 1)
       {   

       try {

           while (true)
           {
            System.out.println("looping.");
   
            Thread.sleep(2000);
           }

       }
       catch (InterruptedException e)
       {

          System.out.println("Interrupted");

       }

       System.out.println("end ");
       
       return "false";

   } 
   
   // 非法参数 抛出异常
   else 
   { 

      throw new Exception("Bad flag value!");

   }

}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		// 定义3个Callable类型的任务

        MyCallable task1 = new MyCallable(0);

        MyCallable task2 = new MyCallable(1);

        MyCallable task3 = new MyCallable(2);

        

       // 创建一个执行任务的线程池

        ExecutorService es = Executors.newFixedThreadPool(3);

        try {

           // 提交并执行任务,任务启动时返回了一个Future对象,
          Future future1 = es.submit(task1);

           // 获得第一个任务的结果,如果调用get方法,当前线程会等待任务执行完毕后才往下执行

            System.out.println("task1: " + future1.get());

            

            Future future2 = es.submit(task2);

           // 等待5秒后,再停止第二个任务。因为第二个任务进行的是无限循环
            
           // System.out.println("task2: " + future2.get(2000,TimeUnit.MILLISECONDS));

            Thread.sleep(5000);

            System.out.println("task2 cancel: " + future2.cancel(true));

            //System.out.println("task2: " + future2.get());

           // 获取第三个任务的输出,因为执行第三个任务会引起异常

            // 所以下面的语句将引起异常的抛出

            Future future3 = es.submit(task3);

            System.out.println("task3: " + future3.get());

        } catch (Exception e){

            System.out.println(e.toString());

        }

       // 停止任务执行服务

        es.shutdownNow();
		
		
	}
	
	

}



运行结果如下

task1: flag = 0
looping.
looping.
looping.
task2 cancel: true
Interrupted
end
java.util.concurrent.ExecutionException: java.lang.Exception: Bad flag value!

从结果中可以看出 我们不仅可以获取线程执行的结果,还可以取消线程

分享到:
评论
Global site tag (gtag.js) - Google Analytics