:Java并发库:(重要)
Java1.5以后为了解决多线程并发,死锁等问题引入的工具包。java.util.concurrent。
包含:
ExecutorService:线程池,submit有返回值,而execute没有
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
线程池中有一个atomiticInteger的对象ctl,记录了"线程池中的任务数量"和"线程池状态"2个信息。线程池的5种状态是:Running(新建直接就是这个状态), SHUTDOWN(线程池处在SHUTDOWN状态时,不接收新任务,但能处理已添加的任务。调用线程池的shutdown()接口时,线程池由RUNNING -> SHUTDOWN), STOP(线程池处在STOP状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务。调用线程池的shutdownNow()接口时), TIDYING(当所有的任务已终止,ctl记录的"任务数量"为0,线程池会变为TIDYING状态。当线程池变为TIDYING状态时,会执行钩子函数terminated()。), TERMINATED(线程池彻底终止,就变成TERMINATED状态。)。
Semaphore:通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。如9个人排队等见3个人。acquire,release
ReentrantLock:重入锁,condition.await(),condition.signal(),lock,unlock
Condition的基本使用如下:
*Condition是个接口,基本的方法就是await()和signal()方法;
*Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
* 调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以
* 和Object.wait()方法一样,每次调用Condition的await()方法的时候,当前线程就自动释放了对当前锁的拥有权
http://outofmemory.cn/java/java.util.concurrent/lock-reentrantlock-condition
BlockingQueue:阻塞队列
ScheduledExecutorService:方法使用各种延迟创建任务,可安排在给定的延迟后运行或定期执行的命令。
池量重阻计。