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工具类。
常见的线程池
- ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); — 超时会销毁池中的线程
- ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); — 线程池中的线程即使空闲也不销毁
- ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
- ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); — 能够定时执行任务的线程池,比如可以用在数据采集功能,每隔一小时执行一次
第四类 工具类
比如 CyclicBarrier, CountDownLatch 用来协调多个线程,执行顺序的
第五类 线程安全的集合类 比如BlockingQueue ConcurrentMap