本文主要为广大网友提供“实战java Concurrent”,希望对需要实战java Concurrent网友有所帮助,学习一下!
讲到Java多线程,大多数人脑海中跳出来的是Thread、Runnable、synchronized……这些是最基本的东西,虽然已经足够强大,但想要用好还真不容易。从JDK 1.5开始,增加了java.util.concurrent包,它的引入大大简化了多线程程序的开发(要感谢一下大牛Doug Lee)。 java.util.concurrent包分成了三个部分,分别是java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.lock。内容涵盖了并发集合类、线程池机制、同步互斥机制、线程安全的变量更新工具类、锁等等常用工具。 为了便于理解,本文使用一个例子来做说明,交代一下它的场景:假设要对一套10个节点组成的环境进行检查,这个环境有两个入口点,通过节点间的依赖关系可以遍历到整个环境。依赖关系可以构成一张有向图,可能存在环。为了提高检查的效率,考虑使用多线程。 1、Executors 通过这个类能够获得多种线程池的实例,例如可以调用newSingleThreadExecutor()获得单线程的ExecutorService,调用newFixedThreadPool()获得固定大小线程池的ExecutorService。拿到ExecutorService可以做的事情就比较多了,最简单的是用它来执行Runnable对象,也可以执行一些实现了Callable<T>的对象。用Thread的start()方法没有返回值,如果该线程执行的方法有返回值那用ExecutorService就再好不过了,可以选择submit()、invokeAll()或者invokeAny(),根据具体情况选择合适的方法即可。Java代码 package service; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; /** * 线程池服务类 * * @author DigitalSonic */ public class ThreadPoolService { /** * 默认线程池大小 */ public static final int DEFAULT_POOL_SIZE = 5; /** * 默认一个任务的超时时间,单位为毫秒 */ public static final long DEFAULT_TASK_TIMEOUT = 1000; private int poolSize = DEFAULT_POOL_SIZE; private ExecutorService executorService; /** * 根据给定大小创建线程池 */ public ThreadPoolService(int poolSize) { setPoolSize(poolSize); } /** * 使用线程池中的线程来执行任务 */ public void execute(Runnable task) { executorService.execute(task); } /** * 在线程池中执行所有给定的任务并取回运行结果,使用默认超时时间 * &nbs