线程十三:并发工具类

并发工具类是在jdk1.5提出的,可以把它理解成一个包含了很多强大且易扩展的高性能线程工具类的框架。通过前面的文章介绍,大家现在已经了解了java语言提供的底层操作一个线程的过程,有了多线程的支持使得java语言可以提供高性能的多线程解决方案。

虽然java提供了底层的线程支持,但是它本身也存在一些下面的问题:1.低级别的并发原语很难正确的使用,比如如何正确的使用synchronized以及wait和notify方法,这需要大量的实验,同时这些原语的误用可能会导致死锁等严重的问题。2.大量的使用同步(synchronized)会严重影响程序的性能,在很多多线程的网络应用下,情况尤其明显。3.java本身不支持高级的线程结构,如果要在程序中使用,必须自己构建,这加大了出现bug的几率。由于这些问题导致了多线程的开发变得困难和不易操作,并发工具类就是在这种条件下被加入到了jdk1.5中,便于程序员开发出高性能的java多线程应用。

并发工具类主要在三个开发包中,分别是:1.java.util.concurrent是最常用的开发包,其中包含了executors等重要元素。2.java.util.concurrent.atomic支持在单个的变量上使用线程安全的无锁操作。3.java.util.concurrent.locks提供了获取锁和执行等待的操作类,它能有效提高程序的伸缩性和性能。

在线程篇的第一篇文章中,我跟大家聊了一下如何创建线程,其中提到了三种创建多线程的方案。在前面两种方案上,使用了java的基础线程创建方案,这两种方案虽然创建了可用的线程,但是它们任务的提交和逻辑是绑定在一起的,使用并发工具类的第三种方案有效解决了这个问题。为了描述的方便,我们先来看一下如何使用Executor来完成线程的创建和提交:

例子中创建了一个Runnable的对象r1,实现了其中的run方法,由于是非守护线程,所以添加了System.exit方法。接着程序获取了Executor对象executor,并使用它执行了任务r1。这种提交方式实现了线程逻辑和提交的分离,提高了程序的扩展性。

虽然Executor能实现线程逻辑和提交的分离,但是它还是有一些局限性,比如:1.Executor只能提交Runnable接口的实现对象,无法获取线程的返回值;2.没有提供追踪任务的方法,无法获取线程的执行状态;3.无法批量提交任务,以及无法关闭Executor。

为了解决Executor的问题,系统提出了ExecutorService接口。

参考链接

猜你喜欢

转载自blog.csdn.net/qq_34479912/article/details/82726069
今日推荐