在java线程编写,大部分可以用成熟的工具类来实现。

1.quartz这个工具在前面文章介绍过,是个定时器的工具,可以很方便的实现大部分功能。

2.ThreadLocal(线程范围内的共享数据)

ThreadLocal<Integer> x = new ThreadLocal<Integer>();

一个线程有一个空间可以共享。可以利用泛型设计复杂的数据结构

也可以利用这个设计线程的单例模式

java DocumentBuilder 类线程安全吗 java 线程工具类_阻塞队列


3.线程池

java DocumentBuilder 类线程安全吗 java 线程工具类_java_02

4.callable与future

java DocumentBuilder 类线程安全吗 java 线程工具类_java_03

实例代码:

java DocumentBuilder 类线程安全吗 java 线程工具类_类_04


5.Lock锁对象

比较简单的应用:

java DocumentBuilder 类线程安全吗 java 线程工具类_线程池_05

java DocumentBuilder 类线程安全吗 java 线程工具类_类_06


6.读写锁

读写锁就是一种,可以同时读,不能同时读写,写写

提供一个用读写锁实现缓存实例代码:

java DocumentBuilder 类线程安全吗 java 线程工具类_线程池_07


7.Condition 基于Lock 的通信

java DocumentBuilder 类线程安全吗 java 线程工具类_阻塞队列_08

java DocumentBuilder 类线程安全吗 java 线程工具类_阻塞队列_09


使用自带的方法,休息与唤醒实现协调工作



例子:实现一个阻塞队列


java DocumentBuilder 类线程安全吗 java 线程工具类_阻塞队列_10


java DocumentBuilder 类线程安全吗 java 线程工具类_多线程_11


8.Semaphore 实现信号灯

java DocumentBuilder 类线程安全吗 java 线程工具类_阻塞队列_12


Semaphore sp = new Semaphore(3);


获取一个信号


释放一个信号



9.CyclicBarrier 

这个是要等到全部的线程都到达才会一起进行下去

例子:直接到有3个都到达了才会继续下一个

java DocumentBuilder 类线程安全吗 java 线程工具类_阻塞队列_13

10.CountDownLatch 倒计时器

java DocumentBuilder 类线程安全吗 java 线程工具类_阻塞队列_14

cdOrder.countDown();计数器减一

cdOrder.await();计数器为0时候触发


11.Exchanger两个线程之间的数据交换

java DocumentBuilder 类线程安全吗 java 线程工具类_多线程_15


会等待另外一个线程的到达,交换数据


12.队列

 队列是一种数据结构.它有两个基本操作:在队列尾部加人一个元素,和从队列头部移除一个元素就是说,队列以一种先进先出的方式管理数据。Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接口。Queue接口窄化 了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。BlockingQueue 继承了Queue接口。

       Queue的操作接口有:

add

remove   移除并返回队列头部的元素                    如果队列为空,则抛出一个NoSuchElementException异常
element  返回但不移除队列头部的元素                如果队列为空,则抛出一个NoSuchElementException异常
offer       添加一个元素并返回true                        如果队列已满,则返回false,不会有异常
poll         移除并返问队列头部的元素                    如果队列为空,则返回null,不会有异常
peek       返回但不移除队列头部的元素                如果队列为空,则返回null,不会有异常

        BlockingQueue在Queue基础上添加的接口:
put         添加一个元素                                         如果队列满,则阻塞
take

offer(E e, long timeout, TimeUnit unit)                队列满时指定阻塞时间,否则立即返回false,不会有异常

poll(long timeout, TimeUnit unit)                          队列空时指定阻塞时间,否则立即返回null

几种阻塞队列:

LinkedBlockingQueue的容量默认是没有上限的(在不指定时容量为Integer.MAX_VALUE),也可以选择指定其最大容量,它是基于链表的队列,此队列按 FIFO(先进先出)排序元素。

ArrayBlockingQueue在构造时需要指定容量,并可以选择是否需要公平性(默认false),如果公平参数 被设置true,等待时间最长的线程会优先得到处理(其实就是通过将ReentrantLock设置为true来达到这种公平性的:即等待时间最长的线程 会先操作)。通常,公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用它。它是基于数组的阻塞循环队列,此队列按 FIFO(先进先出)原则对元素进行排序。

PriorityBlockingQueue是一个带优先级的队列,而不是先进先出队列。元素按优先级 顺序被移除,该队列也没有上限(看了一下源码,PriorityBlockingQueue是对PriorityQueue的再次包装,是基于堆数据结构 的,而PriorityQueue是没有容量限制的,与ArrayList一样,所以在优先阻塞队列上put时是不会受阻的,但是如果队列为空,取元素的操作take就会阻塞。另外,往入该队列中的元 素要具有比较能力。

DelayQueue(基于PriorityQueue来实现的)是一个存放Delayed 元素的无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且poll将返回null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于或等于零的值时,则出现期满,poll就以移除这个元素了。此队列不允许使用 null 元素。



13.同步集合

Collections工具类

java DocumentBuilder 类线程安全吗 java 线程工具类_java_16


注意:在集合的迭代过程中,不能对集合进行删除操作


这个时候可以用CopyOnWriteArrayList