在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果。
所以run的返回值是void类型。

如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使用多线程来计算。
但后者需要前者的结果,就需要用callable接口了。
callable用法和runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以任意指定。

线程是属于异步计算模型,所以你不可能直接从别的线程中得到函数返回值。

这时候,Future就出场了。Futrue可以监视目标线程调用call的情况,当你调用Future的get()方法以获得结果时,当前线程就开始阻塞,直接call方法结束返回结果。

下面三段简单的代码可以很简明的揭示这个意思:

runnable接口实现的没有返回值的并发编程。

package com.future; import java.util.concurrent.ExecutorService; import
java.util.concurrent.Executors; public class FutureTest1 { public static class
Task implements Runnable { @Override public void run() {
System.out.println("execute!!!"); } } public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();  for (int i
= 0; i < 10; i++) { executorService.submit(new Task()); } if
(!executorService.isShutdown()) {              executorService.shutdown();   
      }  } }

callable实现的存在返回值的并发编程。(使用Future获取返回值,call的返回值String受泛型的影响)

package com.future; import java.util.ArrayList; 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 FutureTest3 { public static class Task implements Callable<String> {
@Override public String call() throws Exception {
System.out.println("execute!!!"); return "complete"; } } public static void
main(String[] args) throws InterruptedException, ExecutionException {
List<Future<String>> results = new ArrayList<Future<String>>(); ExecutorService
executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++)
{ results.add(executorService.submit(new Task())); } for (Future<String> future
: results) { System.out.println(future.get()); } System.out.println("Main
complete"); if (!executorService.isShutdown()) { executorService.shutdown(); }
} }

技术
©2019-2020 Toolsou All rights reserved,
基于神经网络的车辆牌照字符识别技术Java基础(三) String深度解析 dedecms网站被黑 劫持到其他网站如何解决精准手机号抓取,运营商大数据利用梆梆加固逻辑漏洞取巧脱壳QT 删除目录及文件Java小明A+B苹果不送充填器耳机真为环保?可能还是为了赚钱吧在Pytorch上使用summaryC#中字典的排序方法