JAVA高级基础(72)---Executor执行Callable任务

版权声明:如需转载请标明出处 https://blog.csdn.net/yj201711/article/details/86551977

Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。

取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用

Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。

package org.lanqiao.callable.demo;

import java.util.ArrayList;
import java.util.List;
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 CallableTaskDemo {
	public static void main(String[] args) {
		ExecutorService  es = Executors.newFixedThreadPool(5);
		List<Future<String>> resList = new ArrayList<>();
		//执行任务,并将任务返回的结果保存起来
		for(int i = 0 ;i < 10 ; i++) {
		Future<String> res = es.submit(new CallableTask());
			resList.add(res);
		}
		try {
		for(Future<String> f :resList) {
			while(!f.isDone());//如果任务没有正常完成,则持续等待
			
				System.out.println(f.get());//直到任务完成,则获取返回结果
			} 
		
			
		}catch (InterruptedException | ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			es.shutdown();
		}	
		
		
	}
	
	
}
class CallableTask implements Callable<String>{

	@Override
	public String call() throws Exception {
		
		System.out.println("call方法被执行。。。。");
		String  res  = "当前执行的线程为" + Thread.currentThread().getName();
		return res;
	}
	
}
package org.lanqiao.callable.demo;

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



public class CallableTaskDemo2 {
	public static void main(String[] args) {
		ExecutorService es = 	Executors.newCachedThreadPool();
		int sum = 0 ;
		try {
			for(int i = 0 ; i <= 100 ;i++) {
				Future< Integer> res = es.submit(new CallableTask2(sum,i));
				sum = res.get();
				System.out.println(sum);
			}
		}catch (Exception e) {
			// TODO: handle exception
		}finally {
			es.shutdown();
		}
			
			
		
		
		
	}
}
class CallableTask2 implements Callable<Integer>{
	int sum = 0;//第一个加数
	int currentNum = 0;//第二个加数
	public CallableTask2(int firstNum , int secondNum) {
		this.sum = firstNum;
		this.currentNum = secondNum;
	}
	/*
	 * 完成数的相加
	 * @see java.util.concurrent.Callable#call()
	 */
	@Override
	public Integer call() throws Exception {
		sum += currentNum;
		System.out.println(Thread.currentThread().getName() +"==="+sum);
		return sum;
	}
	
}

猜你喜欢

转载自blog.csdn.net/yj201711/article/details/86551977