文章目录
- java异步03——Future
- Future接口
- FutureTask
- 用法
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的了解。