各位老铁们好,相信很多人对线程生命周期的五种状态都不是特别的了解,因此呢,今天就来为大家分享下关于线程生命周期的五种状态以及线程状态是5种还是6种的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
线程有几种状态
[1]新生状态(New):当一个线程的实例被创建即使用new关键字和Thread类或其子类创建一个线程对象后,此时该线程处于新生(new)状态,处于新生状态的线程有自己的内存空间,但该线程并没有运行,此时线程还不是活着的(notalive)。
[2]就绪状态(Runnable):通过调用线程实例的start()方法来启动线程使线程进入就绪状态(runnable);处于就绪状态的线程已经具备了运行条件,但还没有被分配到CPU即不一定会被立即执行,此时处于线程就绪队列,等待系统为其分配CPCU,等待状态并不是执行状态;此时线程是活着的(alive)。
[3]运行状态(Running):一旦获取CPU(被JVM选中),线程就进入运行(running)状态,线程的run()方法才开始被执行;在运行状态的线程执行自己的run()方法中的操作,直到调用其他的方法而终止、或者等待某种资源而阻塞、或者完成任务而死亡;如果在给定的时间片内没有执行结束,就会被系统给换下来回到线程的等待状态;此时线程是活着的(alive)。
[4]阻塞状态(Blocked):通过调用join()、sleep()、wait()或者资源被暂用使线程处于阻塞(blocked)状态;处于Blocking状态的线程仍然是活着的(alive)。
[5]死亡状态(Dead):当一个线程的run()方法运行完毕或被中断或被异常退出,该线程到达死亡(dead)状态。此时可能仍然存在一个该Thread的实例对象,当该Thread已经不可能在被作为一个可被独立执行的线程对待了,线程的独立的callstack已经被dissolved。一旦某一线程进入Dead状态,他就再也不能进入一个独立线程的生命周期了。对于一个处于Dead状态的线程调用start()方法,会出现一个运行期(runtimeexception)的异常;处于Dead状态的线程不是活着的(notalive)。
为什么要使用线程池
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。
JVM线程状态都有哪几种
[1]新生状态(New):当一个线程的实例被创建即使用new关键字和Thread类或其子类创建一个线程对象后,此时该线程处于新生(new)状态,处于新生状态的线程有自己的内存空间,但该线程并没有运行,此时线程还不是活着的(notalive)。
[2]就绪状态(Runnable):通过调用线程实例的start()方法来启动线程使线程进入就绪状态(runnable);处于就绪状态的线程已经具备了运行条件,但还没有被分配到CPU即不一定会被立即执行,此时处于线程就绪队列,等待系统为其分配CPCU,等待状态并不是执行状态;此时线程是活着的(alive)。
[3]运行状态(Running):一旦获取CPU(被JVM选中),线程就进入运行(running)状态,线程的run()方法才开始被执行;在运行状态的线程执行自己的run()方法中的操作,直到调用其他的方法而终止、或者等待某种资源而阻塞、或者完成任务而死亡;如果在给定的时间片内没有执行结束,就会被系统给换下来回到线程的等待状态;此时线程是活着的(alive)。
[4]阻塞状态(Blocked):通过调用join()、sleep()、wait()或者资源被暂用使线程处于阻塞(blocked)状态;处于Blocking状态的线程仍然是活着的(alive)。
[5]死亡状态(Dead):当一个线程的run()方法运行完毕或被中断或被异常退出,该线程到达死亡(dead)状态。此时可能仍然存在一个该Thread的实例对象,当该Thread已经不可能在被作为一个可被独立执行的线程对待了,线程的独立的callstack已经被dissolved。一旦某一线程进入Dead状态,他就再也不能进入一个独立线程的生命周期了。对于一个处于Dead状态的线程调用start()方法,会出现一个运行期(runtimeexception)的异常;处于Dead状态的线程不是活着的(notalive)。
易语言线程与时钟区别
易语言线程与时钟是完全不同的两个概念.
线程,通常指多线程,和子程序有所区别,假如有两个子程序,程序执行的时候会先执行第一个子程序,然后执行第二个子程序,而多线程是同时进行执行两个子程序,这就是线程。
时钟好说,就是循环的意思.
比如说:时钟1.时钟周期=1000'1000表示一秒.
这样在,时钟1周期里面的命令都是1秒钟响应一次。
如何学习Java多线程
JAVA中的多线程使用十分广泛,很多的JAVA框架都使用到了多线程,比如spring,mybatis,druid等!
多线程有什么好处呢?比如说web服务器的多连接,异步调用,并行操作,避免持续阻塞等等!
多线程怎么实现呢?1,继承Thread类,2,实现Runnable接口,3实现callable+futureTask实现异步回调,4,使用线程池Executors.newFixedThreadPool(5);
多线程怎么保证线程安全?
1,时间换空间:加锁
①,synchronize:锁方法,锁代码段,锁对象,锁的粒度大!
②,reentrantlock:使用lock和unlock实现加锁和解锁,可使用ReadWriteLock读写锁来实现读和写的锁分离,底层使用CAS和AQS实现,这也是很多框架里面用到的技术!
2,空间换时间:线程的本地变量隔离,ThreadLocal,实现一个线程一份变量,数据不共享,所以线程安全,spring中bean默认都是单例的,但是spring接受并发请求是线程安全的,就是因为使用threadlocal把请求,上下文数据装在了线程里。所以请求之间互不干涉!
JAVA多线程还涉及到哪些技术?
1,synchonizeHashmap,hashTable(基本上是锁方法,所以效率低),concurrentHashmap(分段锁,锁粒度小,性能好),CopyOnWriteArrayList、CopyOnWriteArraySet(可重入锁)等等!
2,countdownbatch用做计数器!
3,使用forkjoin做并行计算!
4,有锁不如无锁!
....
多了解这些技术下面底层的东西,多去实际情景中总结,犯错然后改正才能更快的成长!
JAVA多线程知识点可以写好几本书,而随便一个知识点都可以写一章,只有经常钻研并使用才能懂其精髓,希望我在这条路上越走越远,以后学到的东西就记录于此,互相学习,共勉。。
如果你还想了解更多这方面的信息,记得收藏关注本站。