多线程(线程池创建)
创建线程有4种: Thread、 Runnable Callable Executor 的工具类创建线程池
newCachedThreadPool: 创建一个可缓存线程池
newFixedThreadPool: 创建一个定长线程池 可控制线程最大并发数
newScheduledThreadPool: 创建一个定长线程池 ,支持定时及周期性任务
newSingleThreadExecutor 创建一个单线程划的线程池,他只会用唯一的工作线程来执行任务
线程的生命周期及5种状态:
1、新建状态 线程创建以后会进入新建状态
2、就绪状态 当调用start()方法 线程就开始进入就绪状态 处于就绪状态只是说明此线程已经做好准备,随时等待CPU调度执行
3、运行状态 (run方法)CPU开始调度处于就绪状态的线程 线程才真正执行
4、阻塞状态 处于运行中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时就进入阻塞状态
产生阻塞的原因: a.运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
b.同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
c.通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5、死亡状态 线程执行完毕或退出run() 该线程结束生命周期
线程池的优点:
1、重新使用存在的线程,减少对象的创建销毁开销
2、可有效的控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞
3、提供定时执行、定期执行、单线程、并发数控制等功能
11、常用的并发工具类有哪些?
CountDownLatch (使用过)
CyclicBarrier
Semaphore
Exchanger
sleep方法和wait方法有什么区别?
sleep方法和wait方法都可以用来放弃CPU一定的时间,不同点在于如果线程持有某个对象的监视器,sleep方法不会放弃这个对象的监视器,wait方法会放弃这个对象的监视器
ConcurrentHashMap的并发度是什么
ConcurrentHashMap的并发度就是segment的大小,默认为16,这意味着最多同时可以有16条线程操作ConcurrentHashMap,这也是ConcurrentHashMap对Hashtable的最大优势,
任何情况下,Hashtable能同时有两条线程获取Hashtable中的数据吗?