java concurrent包常用类小结

concurrent包是常用多线程的相关包,最近由于开发sdn程序,对于多线程使用比以前多了很多,现简单总结下。

第一类 原子类:用在多个线程共同操作一个计数的情况

AtomicLong

AtomicInteger

第二类 lock和condition

condition是从lock中得到的,所以在使用时,在执行了lock.lock()后才进行condition的操作,condition常用的两个方法await和signal。

常用在多个线程操作一个共同的资源,一个线程执行结束后,另一个线程才能执行的情况。

另外,lock应该代替以前的synchronized关键字。synchronized属于jvm层面的同步策略,由jvm进行锁的分配和释放。但是据说高并发量时,需要频繁切换线程栈,性能不好。

从今以后,代码中应该使用lock实现同步。

第三类 多线程任务执行ExecutorService

这部分大体上涉及到三个概念,

Callable 被执行的任务

Executor 执行任务()

Future 异步提交任务的返回数据 FutureTask为具体实现

线程资源是系统很珍贵的资源,的确不应该由程序员随意的new Thread方式,自己启动线程。如果项目上有自己的框架,应该使用项目框架中的线程工具,如果没有最好使用jdk提供的ExecutorService工具类。

常见的线程池

  1. ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); -- 超时会销毁池中的线程
  2. ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); -- 线程池中的线程即使空闲也不销毁
  3. ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
  4. ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); -- 能够定时执行任务的线程池,比如可以用在数据采集功能,每隔一小时执行一次

第四类 工具类

比如 CyclicBarrier, CountDownLatch 用来协调多个线程,执行顺序的

第五类 线程安全的集合类 比如BlockingQueue ConcurrentMap