Java多线程工具类

273 阅读2分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

1. Java的Thread类

  1. Thread.yield() 放弃本次被调度的机会,同时 随机 唤醒 一个 正在等待被调度的线程。
  2. Thread.sleep(long) 进入睡眠状态一段时间,同时不放弃监控器的拥有权。
  3. Thread.currentThread() 获取当前线程对象。
  4. Thread.interrupted() 判断线程当前是否中断,同时清除线程中断状态。
  5. 等待子线程结束后再继续运行:t.join()
  6. 判断线程当前状态:t.isAlive()、t.isDaemon()、t.isInterrupted()
  7. 获取线程执行优先级:t.getPriority()

2. Java多线程常用类

  1. Semaphore 信号量
  2. Exchanger 线程间通信
  3. CountDownLatch 一次同步
  4. CyclicBarrier 多次同步
  5. Phaser 动态调整的同步器
  6. Future/Callable 异步返回(是否有返回值或抛出异常)
  7. CompletionSerivce 异步边生产边处理
  8. ScheduledExecutorService 计划任务
  9. Fork-Join 分治并行编程

3. Java多线程集合类

  1. ConcurrentHashMap 哈希Map,读写操作时对链表头或红黑树根节点加锁。
  2. ConcurrentSkipListMap 跳表Map(对比上一个,数据天然有序,但查询效率略低)
  3. ConcurrentSkipListSet 跳表集合
  4. ConcurrentLinkedQueue 链式队列
  5. ConcurrentLinkedDeque 链式双端队列
  6. CopyOnWriteArrayList 基于数组的列表(写时复制)
  7. CopyOnWriteArraySet 基于数组的集合(写时复制)

顺手对比一下 Java 跟 Golang 的并发集合类

JavaGolang
make(chan int, 0)SynchronousQueue/
make(chan int, INT_MAX)new LinkedBlockingQueue/()
make(chan int, 10)new ArrayBlockingQueue<Integer>(10)

4. 线程池

由方法 new ThreadPoolExecutor(最多7个参数) 定义线程池。参数包含:

  1. 核心线程数目。
  2. 最大线程数目:核心用完的时候,可以继续创建线程直到达到 最大线程数目。
  3. 线程存活时间值:结合下一个参数,当线程无任务执行时,超过 核心线程数目 的多余线程等待多长时间就会主动销毁。
  4. 线程存储时间单位。
  5. 阻塞队列对象:没有足够的线程可以执行任务时,会把任务临时存到此队列中。
  6. 创建线程的工厂对象:实际运行时会调用此工厂的 newThread 来创建新的线程,通常用来自定义线程的名称/分组。
  7. 拒绝策略:当 阻塞队列 满了之后,使用的拒绝方式。
说明 |
Executors.newSingleThreadExecutor()最大1个线程可用的线程池
Executors.newCachedThreadPool()无限个线程可用(按需创建)的线程池
Executors.newFixedThreadPool(10)一定数量个线程可用的线程池
Executors.newScheduledThreadPool(10)一定数量个支持按时间调度的线程可用的线程池
Executors.newWorkStealingPool(10)一定数量个支持抢占式调度的线程可用的线程池,10表示并发度,如果不填,则默认为当前机器的CPU核心数