并发,在concurrent包还没有问世前,对于码农来说,真是个很棘手的问题,随着jdk的功能增强,这些问题都简化了不少咯,那现在看下concurrent包到底是个啥玩意吧。
有了这包,我们现在就只把执行的任务编写好,然后就把它扔进线程池中,它们之间的并行就不用我们操心,
concurrent包中有几个线程池,如下
newFixedThreadPool(int nThreads)
创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。
newSingleThreadExecutor()
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
newCachedThreadPool()
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。
newScheduledThreadPool()
创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
上面这几个都是在Executors在中创建的,返回的都是ExecutorService,这ExecutorService开始成为主角了,ExecutorService可以执行已提交的 Runnable 任务的对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。通常使用 Executor 而不是显式地创建线程。例如,可能会使用以下方法,而不是为一组任务中的每个任务调用 new Thread(new(RunnableTask())).start():还提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。
public interface ExecutorService extends Executor {
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException;
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException;
<T> T invokeAny(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
这是ExecutorService的主要方法,它的一般操作步骤是
1)通过Executors 来创建线程池,
2)执行ExecutorService中的submit()方法,如果需要返回值,就执行3)
3) 将submit()方法返回值赋给Future类,这个类了给Runnable 功能是一样的,不一样的是 Future有返回值得,在调用Future的get()方法,取得返回值,就OK了,
注:ExecutorService中submit重载方法中有个Runable参数,这Runnable实现的任务是没有返回值得,如果这个方法返回成功,返回的是null,
为何要设计这个方法了?个人认为是如果在提交多个任务时,任务又Runnable,callable类型,需要被提交,如果不能提交Runnable任务,那么就会执行中断,后面的任务就不会执行了啥,其他的还没想出来,
课后思考
问题1
这样的设计模式优点和缺点?
问题2
如果是你,你该怎样设计这个并发问题?
分享到:
相关推荐
Java并发基础
这套课程既可以作为从零基础开始...课程的主要内容涉及有JAVA基础课程、JAVA多线程与并发编程、数据库开发基础和进阶、Spring Framework、Spring进阶、Spring MVC框架、Spring boot、Java常用类库、Java异常处理等等
书中会首先介绍Java并发编程的基础知识,包括线程的创建和运行,同步机制的基本用法,以及Java内存模型的相关概念。随着章节的深入,作者可能会更深入地讲解Java提供的并发工具,例如锁、原子变量、线程池、以及并发...
这本书是Java开发者提升并发编程能力的宝贵资源,适合有一定Java基础并希望在并发编程领域深入学习的读者。通过阅读并实践书中的内容,读者可以更好地应对高并发场景下的各种挑战,提高系统的效率和稳定性。
Java并发基础
总之,《Java并发编程实战》是一本全面介绍Java并发编程的书籍,适合有一定Java基础并希望提升并发编程能力的开发者阅读。通过学习,你可以掌握解决并发问题的策略和技巧,编写出更加健壮和高效的多线程应用。
1. **线程基础**:线程是操作系统分配CPU时间的基本单位,是实现并发的基础。书中可能会详细介绍Java中的线程API,包括`Thread`类、`Runnable`接口、线程池(如`ExecutorService`)以及线程同步机制(如`...
JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。
实战Java高并发程序设计主要介绍基于Java的并行程序设计基础、思路、方法和实战。首先,立足于并发程序基础,详细介绍...实战Java高并发程序设计内容丰富,实例典型,实用性强,适合有一定Java基础的技术开发人员阅读。
Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...
此外,Java并发编程还包括对并发容器的使用,如ArrayList、LinkedList、HashSet、HashMap等基础容器在并发环境下可能存在问题,Java提供了一些线程安全的容器,如Vector、HashTable以及java.util.concurrent包下的...
《实战Java高并发程序设计》是一本专注于Java并发编程实践的书籍,试读版提供了前两章的内容,为读者提供了一个初步了解并发编程基础的窗口。在Java领域,并发编程是构建高性能、高效率系统的关键技术,对于软件开发...
Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...
第2章介绍了 Java 并行程序开发的基础, 包括 Java 中 Thread 的基本使用方法等第3章介绍了 JDK 内部对并行程序开发的支持, 主要介绍 JUC (Java.util.concurrent) 中些工具的使用方法、 各自特点及它们的内部实现...
总之,《Java并发编程常识》PPT涵盖了从基础概念到高级技术的广泛内容,包括线程管理、同步机制、并发集合、并发工具以及并发问题的解决。对于希望提升并发编程技能的Java开发者来说,这是一份不可多得的学习资料。
囊括了Android面试中的java多线程知识,包括线程的基础、threadLoca|、并发编程中的锁 JMM synchronized关键字 以及部分垃圾回收机制