java futuretask 状态_Java--FutureTask原理与使用(FutureTask可以被Thread执行,可以被线程池submit方法执行,并且可以监控线程与获取返回值)...

packagecom;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.FutureTask;/*** Created by yangyu on 16/11/28.*/

/*** FutureTask由于实现了Runnable接口,所以可以被Thread执行

* 但是FutureTask又实现了Future接口,所以可以获取返回值,并且监控线程状态

*

* 原理:

* FutureTask实现是基于AbstractQueuedSynchronizer同步框架(下面简称AQS)

* ReentrantLock,Semaphore,ReentrantReadWriteLock,CountDownLatch,FutureTask都是基于AQS同步框架而实现的

* 基于AQS实现的同步器都会包含如下两种类型的操作:

* 1、至少一个acquire操作

* 2、至少一个release操作

*

* Future的get()方法就会检查线程执行状态,如果状态为已经执行完成那么就会返回Callable的返回值,如果状态为没有执行完成,那么会阻塞当前线程并放入等待队列中

* 当其它线程执行release操作以后(如FutureTask.run()或者FutureTask.cancel),就会去唤醒等待队列中的线程*/

public classTestFutureTask {private static class call implements Callable{

@Overridepublic Integer call() throwsException {

Thread.sleep(3*1000);int sum = 0;for (int i = 0; i < 1000; i++) {

sum= sum +i;

}returnsum;

}

}public static voidmain(String[] args) {

FutureTask futureTask1 = new FutureTask(newcall());new Thread(()->{try{

System.out.println("线程执行完成:"+futureTask1.get());

}catch(InterruptedException e) {

e.printStackTrace();

}catch(ExecutionException e) {

e.printStackTrace();

}

}).start();newThread(futureTask1).start();

System.out.println("futureTask开始执行");try{

System.out.println(futureTask1.get());

}catch(InterruptedException e) {

e.printStackTrace();

}catch(ExecutionException e) {

e.printStackTrace();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值