如果有两个线程同时等在一个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处理完毕时,线程重新转入就绪状态。
如果你手动让一个线程wait在一个对象obj上,那么你需要在合适的时候调用obj.notifyAll()来唤醒那些等待的线程,它们中的一个将会得到执行。
现在是一个线程处于阻塞状体,我现在和先置空,再New(),再start,使重新处于运行状态;不知道和你先wait()再notifyAll()有没有什么区别;还有哪些情况会使线程处于阻塞状态,如果线程内出现异常会不会使他处于阻塞状态
你需要给出一些例子了。
你说一个线程因为锁而阻塞,说明它是在等待某个其他线程释放锁。那么最标准的做法是查看你哪里发生了死锁,然后解决之。我说的一些方法是让抓着锁的线程主动放弃锁。关于new/start,我不知道你是否成功了,从理论上来判断,我不认为它会解决问题,因为一个线程抓住了锁不放,即便你开一个新的,它也不会释放啊
——线程内出现异常会不会阻塞
由于你这个问题提在java这里,我会把异常理解成java语言的异常,那么是不会导致阻塞。但是如果你说的异常是指真的线程意外情况,那就不一定了。