什么是Java可调用?

标题几乎总结了它。

我想知道可调用的概念和想法。 我在这里读到了一个关于可调用和可运行之间差异的问题 。 但没有人显示代码并详细说明可调用的内容。 我不想知道它们之间的区别。 我想知道 ,

  1. 什么是可赎回的?

  2. 何时使用它们以及如何使用它们。

  3. 当他们为Android行动时。

您可以查看此示例 :

在此示例中,Callable任务返回一秒钟后执行任务的线程的名称。 我们使用Executor框架并行执行100个任务,并使用Future来获取提交任务的结果。

package com.journaldev.threads; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class MyCallable implements Callable { @Override public String call() throws Exception { Thread.sleep(1000); //return the thread name executing this callable task return Thread.currentThread().getName(); } public static void main(String args[]){ //Get ExecutorService from Executors utility class, thread pool size is 10 ExecutorService executor = Executors.newFixedThreadPool(10); //create a list to hold the Future object associated with Callable List> list = new ArrayList>(); //Create MyCallable instance Callable callable = new MyCallable(); for(int i=0; i< 100; i++){ //submit Callable tasks to be executed by thread pool Future future = executor.submit(callable); //add Future to the list, we can get return value using Future list.add(future); } for(Future fut : list){ try { //print the return value of Future, notice the output delay in console // because Future.get() waits for task to get completed System.out.println(new Date()+ "::"+fut.get()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } //shut down the executor service now executor.shutdown(); } } 

您还可以选中使用Callable从Runnables返回结果

Callable类似于Runnable但它返回一个结果并可能抛出exception。 当您希望异步任务返回结果时使用它们。

返回的异步计算结果由Future表示。

您可以查看使用FutureTask (实现RunnableFuture和Future)实现的这个简单示例

 public static void main(String[] args) { // providing an anonymous callable to FutureTask RunnableFuture future = new FutureTask( new Callable() { @Override public String call() throws InterruptedException { System.out.println("sleeping"); Thread.sleep(2000); System.out.println("returning"); return "hello-world"; } }); Thread t = new Thread(future); t.start(); try { // the get Waits if necessary for the computation to complete System.out.println(future.get()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } }