如何让阻塞状态的线程重新处于运行状态
2022-09-29 · 百度认证:北京惠企网络技术有限公司官方账号
如果有两个线程同时等在一个synchronized方法上,那么当其中一个结束执行的时候,另一个将自动得到机会执行。如果手动让制一个线程wait在一个对象obj上,那么需要在合适的时候调用obj.notifyAll()来唤醒zd那些等待的线程,它们中的一个将会得到执行。
如果发生下面几种情况时,处于运行状态的线程就进入阻塞状态:线程调用了sleep()方法、join()方法时:线程调用wait()方法时;如果线程中使用synchronized来请求对象的锁未获得时;如果线程中有输入/输出操作,则将进入阻塞状态,待输入/输出操作结束后,线程进入可运行状态。
扩展资料
线程的状态、线程的阻塞的方式
1、初始状态
线程的实现有三种方式,一是继承Thread类,二是实现Runnable接口,三是实现Callable接口,但是不管如何,当我们new了这个对象之后,线程就进入了初始化状态。
2、就绪状态
线程被new出来,调用start()方法,此线程进入就绪状态。当前线程sleep()方法结束,其他线程join()方法,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。
锁池里的线程拿到对象锁后,进入就绪状态。该状态的线程位于“可运行线程池”中,变得可运行、只等待获取CPU的使用权,即在就绪状态的进程除CPU之外,其他的运行所需资源都已全部获得。
3、运行中状态
线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。
4、阻塞状态
等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒
5、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
6、其他阻塞:运行的线程执行sleep()方法或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。