java异步03——Future

java异步03——Future

Future接口

Future接口一共有5个接口方法

  • V get() throws InterruptedException, ExecutionException:等待异步计算任务完成,并返回结果;如果当前任务计算还没有完成则会阻塞调用线程直到任务完成;如果在等待结果的过程中的有其他线程取消了该任务,则调用线程抛出CancellationException 异常;如果在等待结果的过程中有其他线程中断了该线程,则调用线程抛出InterruptedException异常;如果任务计算过程中抛出了异常,则调用线程会抛出ExecutionException。
  • V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionExeption, TimeoutException:相比get()方法多了超时时间,当线程调用了该方法后,在任务结果没有计算出来前调用线程不会一直被阻塞,而是会在等待timeout个unit单位的时间后抛出TimeoutException异常后返回。添加超时时间避免了调用线程死等的情况,让调用线程可以及时释放。
  • boolean isDone():如果计算任务已经完成则返回true,否则返回false。需要注意的是,任务完成是指任务正常完成了、由于抛出异常而完成了或者任务被取消了
  • boolean cancel(boolean mayInterruptIfRunning):尝试取消任务的执行;如果当前任务已经完成或者任务已经被取消了,则尝试取消任务会失败;如果任务还没被执行时调用了取消任务,则任务将永远不会被执行;如果任务已经开始运行了,这时候取消任务,则参数mayInterruptIfRunning将决定是否要将正在执行任务的线程中断,如果为true则标识要中断,否则标识不中断;当调用取消任务后,再调用isDone()方法,后者会返回true,随后调用isCanceled方法也会一直返回true;如果任务不能被取消,比如任务完成后已经被取消了,则该方法会返回false。
  • boolean isCancelled():如果任务在执行完毕前被取消了,则该方法返回true,否则返回false。

FutureTask

用法

public class AsynchronousByUseFuture {	
	public static String doSomethingA(){
		try{
			Thread.sleep(2000);
		}catch (InterruptedException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		System.out.println("--- doSomethingA---");
		return "TaskAResult";
	}
	public static String doSomethingB(){
		try{
			Thread.sleep(2000);
		}catch (InterruptedException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		System.out.println("--- doSomethingB---");
		return "TaskBResult";
	}
	public static void main(String[] args) throws InterruptedException, ExecutionException{
		long start = System.currentTimeMillis();
		FutureTask<String> futureTask = new FutureTask<>(AsynchronousByUseFuture::doSomethingA);
		Thread thread = new Thread(futureTask, "threadA");
		thread.start();
		String taskBResult = doSomethingB();
		String taskAResult = futureTask.get();
		System.out.println(taskAResult + " " + taskBResult);
		System.out.println(System.currentTimeMillis()-start);
	}
}

futuretask的用法:FutureTask<V>V是类型参数,指的是返回值的类型。该类的构造器需要输入一个callable,然后放到线程或者线程池中执行,等线程执行结束从future中读取结果即可。

关于异步的知识储备暂时就到这里,接下来是对netty的了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值