-
callable接口
Callable接口类似于Runnable接口,它的实例对象也可能被一个线程执行。
区别于Runnable接口,Callable接口的实现类可以返回结果,并且能够抛出异常。
-
线程使用Callable
public class CallableTest { public static void main(String[] args) throws ExecutionException, InterruptedException { MyClass myClass = new MyClass(); //FutureTask类是Runnable接口的一个实现类 FutureTask<Integer> futureTask = new FutureTask<>(myClass); //两个线程执行 new Thread(futureTask).start(); new Thread(futureTask).start(); //这里会阻塞 等待线程任务即call方法执行完成 //所以这一句一般放在需要取值的地方 Integer result = futureTask.get(); System.out.println(result); } } class MyClass implements Callable<Integer>{ @Override public Integer call() throws Exception { System.out.println("call"); TimeUnit.SECONDS.sleep(5); return 12345; } }
上面代码执行结果
call 12345
-
分析
Thread类的构造方法只接受Runnable接口的实例对象。Callable接口的对象不能直接传给Thread类使用。
这样看来Thread类和Callable接口不能直接关联起来,只能通过间接的方式关联。
FutureTask类实现了RunnableFuture接口
public class FutureTask<V> implements RunnableFuture<V>
RunnableFuture接口继承了Runnable接口
public interface RunnableFuture<V> extends Runnable, Future<V>
FutureTask类有一个构造方法可以传一个Callable接口的实例
public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); this.callable = callable; this.state = NEW; // ensure visibility of callable }
FutureTask对象可以传给Thread类的构造方法,这样Thread类和Callable接口就关联起来了。
MyClass myClass = new MyClass(); //FutureTask类是Runnable接口的一个实现类 FutureTask<Integer> futureTask = new FutureTask<>(myClass); new Thread(futureTask).start();
futureTask.get() 这个语句会等待线程任务执行完成,并且会缓存结果,所以上面两条线程只输出了一次call。
这是一个适配器模式
九、Callable接口的使用
最新推荐文章于 2024-06-25 14:03:22 发布
本文介绍了Java中Callable接口与FutureTask的使用,Callable接口允许线程返回结果并抛出异常,而FutureTask作为适配器将Callable与Thread关联。在示例代码中展示了如何创建FutureTask并启动线程,以及如何获取线程执行结果。通过FutureTask.get()方法,主线程会阻塞等待任务完成并获取结果。
摘要由CSDN通过智能技术生成