线程的生命周期有5中状态:
1.新建状态new:当线程对象创建后就进入了新建状态 Thread t=new Thread();
2.就绪状态Runnable:当调用线程对象的start()方法,线程就进入了就绪状态--处于就状(可运行)状态的线程,知识说明线程已经做好准备,随时等待CPU调度执行,并不是执行了t.start()此线程就立即会被执行
3.运行状态Running:当CPU调度了处于就绪状态的线程时,此线程才真正执行,即进入运行状态--就绪状态是进入运行状态的唯一入口,也就是说线程想要进入运行状态执行,先得处于就绪状态
4.阻塞状态Blocked:处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,知道其进入就绪状态,才有机会被cpu选中再次执行
根据阻塞状态产生的原因不同,可以细分为三种:
等待阻塞:运行状态中的线程执行wait()方法,本线程进入到等待阻塞状态
同步阻塞:线程在获取synchronize同步锁失败(因为锁被其他线程占有),它会进入同步阻塞状态
其他阻塞:调用线程的sleep()或者join()或发出I/O请求时,线程会进入阻塞状态,当sleep()状态超时,join()等待线程终止或者超时或者I/O处理完毕时线程重新转入就绪状态
5.死亡状态Dead:线程执行完了或者因异常退出run()方法,该线程结束生命周期
===========
什么是线程池?线程池有哪些优点?
每次使用线程的时候就去创建一个线程,这样实现起来非常简便,但是会有个问题:
如果并发的线程数量很多,并且每次线程都执行一个很短的任务就结束了,这样频繁的创建线程会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。
所以可以通过线程池来避免这些问题:
线程池:其实就是一个容纳对个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无须反复创建线程而消耗过多的资源
合理使用线程池能够带来的好处:
1.降低资源的消耗。减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
2.提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行
3.提高线程的可管理性。可以根据系统的承受能力,调整线程池中工作线程的数目,防止因为消耗过多的内存,把服务器累趴(每个线程需要大约1MB内存,线程开的越多,消耗内存也越多,最后死机)