本文主要是介绍使用Callable和FutureTask使用多线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
使用Callable接口封装任务可以获得任务执行后的结果。它的接口定义比较简单,里面有一个call()方法,和Runnable接口里面的run()方法基本一样,可以看到,Callable接口是在util.concurrent多线程包下的类,它的返回值是一个泛型。
package java.util.concurrent;
@FunctionalInterface
public interface Callable<V> {V call() throws Exception;
}
Future接口也是在多线程包下的一个接口,这个接口用于封装多线程异步执行的结果,它有下面几个方法。
package java.util.concurrent;
public interface Future<V> {boolean cancel(boolean mayInterruptIfRunning);boolean isCancelled();boolean isDone();V get() throws InterruptedException, ExecutionException;V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;
}
方法boolean cancel(boolean mayInterruptIfRunning),这个方法根据传入的参数来决定对当前任务进行取消的操作,传入true,代表取消掉当前正在执行但是还未执行完毕的的子任务,传入false代表不取消当前执行的子任务,返回值代表当前是否被成功取消。
方法boolean isCancelled() 可以用来获取当前子任务的状态:是否被取消。
方法boolean isDone() 用来判断当前线程任务是否执行完毕。
方法V get() 用来获取当前执行的子线程任务返回的结果,如果线程还未执行完则进入阻塞等待结果,如果执行过程中出现异常或者被中断,则会抛出对应的异常。
V get(long timeout, TimeUnit unit) 可以设置时间限制的get(),一定的时间下如果还未获取到线程执行的结果则会抛出超时的异常。
看一看FutureTask的继承关系
FutureTask implements RunnableFuture
RunnableFuture extends Runnable, Future
可以看到 RunnableFuture是Runnable和Future组合,当创建一个FutureTask对象时,要传入一个实现了Callable 接口的子任务,FutureTask包装了子任务,然后丢给Thread或者线程池去执行当前封装的任务。
测试代码
/*** 测试多线程FutureTask下获取返回值得小Demo*/
public class MutipleThread {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask futureTask = new FutureTask<String>(new Callable<String>() {@Overridepublic String call() throws Exception {return "这个是返回值";}});futureTask.run();System.out.println((String) futureTask.get());}
}
这篇关于使用Callable和FutureTask使用多线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!