以下哪些属于java线程的状态,线程的几种状态分别是什么

  以下哪些属于java线程的状态,线程的几种状态分别是什么

  如何解决写爬虫IP受阻的问题?立即使用。

  Java中的线程的生命周期大体可分为5种状态。

  1.初始状态(新):创建新的线程对象。

  2.RUNNABLE:线程对象创建后,其他线程(比如主线程)调用对象的start()方法。这种状态下的线程位于可运行线程池中,等待被线程调度选中,获得cpu的使用权。

  3.RUNNING:runnable线程获取cpu时间片并执行程序代码。

  4.阻塞:阻塞状态是指线程因为某种原因放弃使用cpu的权利,即放弃cpu时间片,暂时停止运行。在线程进入可运行状态之前,没有机会让cpu时间片再次进入运行状态。有三种阻塞情况:

  5.DEAD:当线程的run()和main()方法的执行结束,或者run()方法由于异常而退出时,线程结束其生命周期。死线不能复生。

  一、线程的状态图

  二、初始状态

  实现Runnable接口,继承thread可以得到一个Thread类。当new的一个实例出来时,线程进入初始状态。

  三、可运行状态

  1.可运行状态只意味着你有资格运行。如果您没有被调度程序选中,您将始终是可运行的。

  2.调用线程的start()方法,线程进入runnable状态。

  3.当当前线程的sleep()方法结束,其他线程join()结束,等待用户输入结束,一个线程获得对象锁,这些线程也会进入runnable状态。

  4.当当前线程的时间片用完时,调用当前线程的yield()方法,当前线程将进入可运行状态。

  5.锁池中的线程获得对象锁后,进入runnable状态。

  四、运行状态

  当线程调度器从可运行池中选择一个线程作为当前线程时,线程的状态。这也是线程进入运行状态的唯一途径。

  五、死亡状态

  1.当一个线程的run()方法完成,或者主线程的main()方法完成,我们就认为它死了。这个线程对象可能是活动的,但它不再是一个单独的线程。线程一旦死亡,就无法复活。

  2.在死线程上调用start()方法将引发Java . lang . illegalthreadstateexception异常异常。

  六、阻塞状态

  1.当前线程T调用Thread.sleep()方法,当前线程进入阻塞状态。

  2.当前线程中运行的其他线程t2调用join()方法,当前线程进入阻塞状态。

  3.在等待用户输入时,当前线程进入阻塞状态。

  七、等待队列(本是Object里的方法,但影响了线程)

  1.在调用obj的wait()和notify()方法之前,必须获得obj锁,也就是说,必须在synchronized(obj)代码段中写入。

  2.与等待队列相关的步骤和图表

  1个线程获得了对象A的锁,并且正在使用对象A。

  1线程调用对象a的wait()方法。

  1线程释放对象A的锁,立即进入等待队列。

  池中的对象竞争对象a的锁。

  5线程获得对象A的锁,进入synchronized块,使用对象A。

  5线程调用对象A的notifyAll()方法,唤醒所有线程,所有线程进入锁池。线程5调用对象A的notify()方法来唤醒线程。不知道它会唤醒谁,被唤醒的线程进入锁池。

  notifyAll()的同步方法结束,线程5释放对象a的锁。

  池中的线程竞争对象锁,但是不知道线程1何时可以获得它。原锁池第六步被唤醒的线程一起竞争对象锁。

  八、锁池状态

  当当前线程要调用对象A的同步方法时,发现对象A的锁被另一个线程占用了。此时,当前线程进入锁池状态。简而言之,锁池中充满了想要竞争对象锁的线程。

  当一个线程1被另一个线程2唤醒时,线程1进入锁池状态来竞争对象锁。

  锁池的概念只存在于同步环境中,一个对象对应一个锁池。

  九、几个方法的比较

  Thread.sleep(long millis),当前线程一定调用了这个方法。当前线程被阻塞,但对象锁没有被释放。毫秒后,线程自动唤醒并进入可运行状态。角色:给其他线程执行机会的最佳方式。

  Thread.yield(),肯定是当前线程调用了这个方法。当前线程放弃获取的cpu时间片,从运行状态变为可运行状态,让OS重新选择线程。函数:让相同优先级的线程轮流执行,但不能保证它们会轮流执行。实际上并不能保证yield()会达到让出的目的,因为让出的线程可能会被线程调度器再次选择。Thread.yield()不会导致阻塞。

  T.join()/t.join(long millis),在当前线程中调用另一个线程1的join方法,当前线程被阻塞,但不释放对象锁。直到线程1的执行完成或者毫秒时间到达,当前线程进入可运行状态。

  Obj.wait(),当前线程调用对象的wait()方法,当前线程释放对象锁,进入等待队列。通过notify()/notifyAll()唤醒或等待(长超时)超时时间自动唤醒。

  Obj.notify()唤醒在这个对象监视器上等待的单个线程,选择是任意的。NotifyAll()唤醒所有等待这个对象监视器的线程。

  推荐教程:《java教程》以上是java线程有哪些状态?更多详情请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: