JAVA并发框架

1. Executor框架

java,util.concurrent.*

  • 分离任务的创建和执行者的创建
  • 线程重复利用

主要类:

  • ExecutorService线程池服务类(使用固定数量和动态增长创建的线程池)
  • Callable接口(与runnable等价,但runnable的run()方法无返回值,Callable的call()方法有返回值)
  • Future返回执行的结果

20200211115724.png

使用方法:

创建线程池:

executor=(ThreadPoolExecutor)Executors.newCachedThreadPool();//创建一个默认自增的线程池
executor=(ThreadPoolExecutor)Executors.newFixedThreadPool(5);//创建与固定线程的线程池

执行任务:

executor.execute(task); //执行  无返回值
//execute方法参数为一个runnable对象
Future<Integer> result=executor.submit(calculator);//
//参数为一个callable对象

关闭:

// 关闭线程池
executor.shutdown();

2. Fork-join框架

适用于整体任务量不好确定的场合,计算量不确定(分治编程)

常用类:

  • ForkJoinPool任务池
  • RecursiveAction
  • RecursiveTask

3. 并发数据结构

阻塞式集合:当集合为空或者为满时,等待

非阻塞式集合:当集合为空或者为满时,不等待,返回null或异常

List:

  • vector 同步安全,写多读少
  • Arraylist不安全
  • Collections.synchronizedList(List list)基于synchronized,效率差
  • CopyOnWriteArrayList读多写少,基于复制机制,非阻塞

Set:

  • HashSet不安全
  • Collections.synchronizedSet(Set set)基于synchronized,效率差
  • CopyOnWriteArraySet读多写少,非阻塞

Map:

  • Hashtable同步安全,写多读少
  • HashMap不安全
  • Collections.synchronizedMap(Map map)基于synchronized,效率差
  • ConcurrentHashMap读多写少,非阻塞

Queue&Deque:

  • ConcurrentLinkedQueue非阻塞,也可看作一个线程安全的LinkList
  • ArrayBlockingQueue和LinkedBlockingQueue阻塞型

4. 线程协作

synchronized互斥锁

Lock也可以实现同步的效果

  • tryLock方法可以预判锁是否空闲

  • 允许分离读写的操作,多个读一个写

  • 性能更好

  • 主要类

    • ReentrantLock类,可重入的互斥锁。
    • ReentrentReadWriteLock类,可重入的读写锁。
    • lock()和unlock()函数。
posted @ 2020-02-25 14:58  Ysalng  阅读(661)  评论(0编辑  收藏  举报