之前做的并发1、2都是做的Runnable,虽然能够实现线程之间的互斥、通信,但是不能实现两个线程之间的信息共享,必须有这样一个需求:有一个service的操作需要发送信息到另一台服务器并且等待确认这个信息被目标机器接受,这个操作很费时间,因为要阻塞,并且造成机器性能的浪费,所以必须要开启多个线程来处理这个service,让一个线程去发送这个信息,另一个线程一边继续操作,一边等待另一个线程的确认信息。这样的需求对于我们之前的操作是根本完成不了的,所以必须要用这一次使用的Future<t> Callable<t>,这个是带泛型的,泛型表示线程的处理结果返回的类型。
【注】 其实我之前也没有关注这个类,因为我实在没有想到他们的应用场景,知道我看了kafka 的producer的java源码才恍然大悟(关于kafka的java部分的源码我会继续写博库的),原来这个类是这么的好,当然我没有深入研究这两个类的源码,我的当下目标是有工具能够解决我的问题就够了,等我真正的实现了我的现阶段的目标后会继续研究源码的。
上例子
public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService pool = Executors.newSingleThreadExecutor(); Future<String> future = pool.submit(new Callable<String>() { public String call() throws Exception { Thread.sleep(1000); return "ok"; } }); System.out.println(System.currentTimeMillis()); System.out.println(future.get()); System.out.println(System.currentTimeMillis()); pool.shutdownNow(); }
callable和runnable差不多,只不过callable会返回一个处理结果,而runnable不会返回结果。将Callable交给线程池去执行,用submit方法,而runnable用execute方法。这里我们创建了含有一个线程的线程池,这个线程最后会返回一个futrue实例,其get方法会返回一个String类型的实例作为这个线程的处理结果。在处理的线程没有执行完之前,(在当前实例中我们强制让其休息一秒)调用future的get方法会阻塞的,所以我们在三个system.out.println()的输出结果中可以发现第一个和第三个的输出差一秒左右。
还可以给线程池添加多个Callble,即提交多个任务,这个时候需要使用ExecutorCompletionService。当下没有研究这个类的使用,略过。
最后注意ExecutorService如果执行线程之后是不会退出的,所以必须使用其shutdownNow()方法,这里简单记录下executorsService的几个方法:
shutdown:不再接受新的任务,等待现在的任务执行完成
shutdownNow:立即尝试停止所有的正在执行的任务。
写完这篇文章我灵机一动,最近完成的诺展商城的搜索模块可以使用这个方法提高搜索速度。当前商城的搜索使用的是solr,solr是单独的一个服务,部署在单独的一个tomcat上,这个tomcat可能和当前运行商城的tomcat部署在一台机器上也可能距离很远,所以可能就出现很长的网络延迟,即如果单线程处理搜索的话可能会阻塞,造成效率降低。如果我们用多线程处理呢?‘即用future callable的方式处理,这样一定会减少阻塞造成的效率降低。具体怎么做我会在以后的商城搜索实战中继续的。
相关推荐
Java并发编程中的多线程协作机制 在 Java 并发编程中,多线程协作机制是非常重要的一部分。多线程协作机制是指在多线程编程中,多个线程之间如何协作、同步和通信,以达到共同完成某个任务的目的。Java 提供了多种...
Java并发编程---synchronized关键
62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java...
Java并发编程-设计原则与模式 pdf格式
Java并发编程实践-电子书-01章.pdf Java并发编程实践-电子书-02章.pdf Java并发编程实践-电子书-03章.pdf Java并发编程实践-电子书-04章.pdf Java并发编程实践-电子书-05章.pdf Java并发编程实践-电子书-06章.pdf ...
本教程“java并发编程-从入门到精通”旨在帮助你深入理解这个领域,并逐步提升你的编程能力。 首先,我们要理解Java并发的基础概念。并发是指一个程序中同时执行的多个线程,这在多核或多处理器系统中尤为常见。...
阿里专家级并发编程架构师级课程,完成课程的学习可以帮助同学们解决非常多的JAVA并发编程疑难杂症,极大的提高JAVA并发编程的效率。课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类...
Java并发编程原汁原味英文版,Doug Lea大神经典著作, 内容:Concurrency Models, design forces, Java Designing objects for concurrency Immutability, locking, state dependence, containment, splitting ...
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
【Java并发编程-并发容器1】 在Java的并发编程中,容器的线程安全是至关重要的。HashMap在多线程环境下可能导致CPU利用率极高,因为它不是线程安全的。HashTable虽然提供了线程安全,但其同步机制导致并发性能较低。...
《Java并发编程实战》这本书是关于Java语言中并发编程技术的经典著作。它详细介绍了如何在Java环境中有效地实现多线程程序和并发控制机制。在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...
"java并发编程-构建块"这个主题涵盖了使程序能够同时处理多个任务的关键概念和技术。在这个主题下,我们将深入探讨Java中用于构建高效并发应用的核心工具和概念。 1. **线程**:Java中的线程是并发编程的基础,每个...
总结,Java并发编程涵盖了大量的概念和技术,包括线程的创建、同步、通信以及并发工具的使用。理解和掌握这些知识点,是成为一名合格的Java并发程序员的基础。在实际开发中,应结合具体场景选择合适的并发策略,以...
04-JUC高并发编程-JUC概述和进程线程概念(3).mp4 05-JUC高并发编程-Synchronized复习和案例分析.mp4& R: O+ [6 A8 h1 L9 | 06-JUC高并发编程-Synchronized实现案例.mp4+ ?2 `( V" U4 z3 F0 w 07-JUC高并发编程-...
《Java并发编程艺术》这本书深入探讨了Java平台上的并发编程技术。并发编程是现代多核处理器环境下提升软件性能的关键手段,而Java语言提供了丰富的工具和API来支持这一领域。本书旨在帮助开发者理解和掌握如何在...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...
《JAVA并发编程实践》是Java开发人员深入理解并发编程的一本经典著作,由Doug Lea撰写,本书中文版高清完整,包含丰富的书签,便于读者查阅和学习。这本书旨在帮助开发者掌握在Java平台上进行高效、安全并发编程的...