多线程2
Future 接口对于具体的Runnable 或者 Callable 任务的执行结果进行取消、查询是否完成、获取结果。 get() 方法获取结果会产生阻塞,会一直等到任务执行完毕才返回。 V get(long timeout, TimeUnit unit) 获取执行结果,如果在指定的时间内,没有获取到结果,则返回null。
Future 提供三种功能: 判断任务是否完成、能够中断任务、能够获取任务执行结果。
FutureTask 类 继承 Runnable和 Future 接口。所以它既可以作为Runnable 被线程执行,又可以作为Future 得到Callable 的返回值。
package fork.task;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**  
* <p>Description:TODO </p>  
* @author zhoudingzhao  
* @date 2019年4月8日  下午2:01:16
* @version 1.0  
*/
public class FutureTaskDemo {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		SonTask task1 = new SonTask("Thread son1");
		FutureTask<String> f1 = new FutureTask<String>(task1);               //传入 Callable 参数,FutureTask 实例的 get() 结果是 Callable 的返回结果。
          
		new Thread(f1).start();
		
		FutureTask<Integer> f2 = new FutureTask<Integer>(new MyRun(),22);   // 传入 Runnable 参数,则 第二个参数就是 FutureTask 实例的 get() 结果。
		new Thread(f2).start();
		System.out.println(f1.get());
		
		System.out.println("result_" + f2.get());
	}
}
class SonTask implements Callable<String> {
	private String name = "";
	SonTask(String name) {
		this.name = name;
	}
	public String call() throws Exception {
		Thread.sleep(1000L);
		System.out.println(name + "任务计算完成");
		return "result_11";
	}
}
class MyRun implements Runnable {
	public void run() {
		try {
			Thread.sleep(10L);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("特定线程2完成");
	}
}
输出:
特定线程2完成  
Thread son1任务计算完成
result_11
result_22
在 f1 和 f2 先后start 执行的情况下, f2 只 sleep 了 10毫秒, 所以先打印 特定线程2完成 ,但是 由于在 f2.get() 之前 先执行 了 f1.get() , 因此需要等待 f1 执行完成。 再输出 f2.get() .
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号