前言:
此时兄弟们对“java多线程callable”大约比较关心,同学们都想要了解一些“java多线程callable”的相关知识。那么小编在网上网罗了一些关于“java多线程callable””的相关内容,希望你们能喜欢,看官们快快来了解一下吧!Callable接口
在创建线程的时候不管是继承Thread类(Thread本身也是实现的Runnable接口)还是实现Runnable接口,所实现的run()方法都没有返回值,使得需要将返回值写到map中,等到线程结束再去从map中取数据,特别的不方便
而且Runnable还有另一个问题是不能抛出任何异常,必须在run()方法中自己处理异常。
由于Runnable存在的两个问题,所以Callable接口和Future接口应运而生,这里来介绍一下Callable接口和Future接口
Callable与Runnable不同,提供的方法为call()方法,大家看到,该方法是有返回值的,且可以抛出异常
获取Callable的返回值需要FutureTask的支持
public interface Callable<V> { /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute a result */ V call() throws Exception;}
使用ExecutorService来执行Callable对象
<T> Future<T> submit(Callable<T> task);
看到该方法返回的是一个Future对象,Future对象是什么呢?
public interface Future<V> { // 在任务正常结束之前可以尝试取消任务 boolean cancel(boolean mayInterruptIfRunning); // 如果任务正常结束之前被取消,isCancelled会返回true boolean isCancelled(); // 检测任务是否结束 boolean isDone(); // get方法会将结果返回给调用方 V get() throws InterruptedException, ExecutionException; // get方法会将结果返回给调用方,可以限制限制超时时间 V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;}FutureTask
FutureTask类同时实现了Runnable接口和Future接口,同时拥有异步能力以及取消任务的能力,可以创建出可取消的任务
示例:
public class TestCallable { public static void main(String[] args) { CallDemo call = new CallDemo(); FutureTask<Integer> futureTask = new FutureTask<>(call); new Thread(futureTask).start(); try { // get方法是一个阻塞方法 在没有执行结束之前一直阻塞,直到执行完毕 int sum = futureTask.get(); System.out.println("---------"); System.out.println(sum); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } }}/** * Callable相较于Runnable有返回值和异常 */class CallDemo implements Callable<Integer>{ @Override public Integer call() throws Exception { int sum = 0; for(int i = 0;i<1000;i++){ sum +=i; } return sum; }}
标签: #java多线程callable