我在看O'reilly的<<Java线程>>时,看到了如下一段代码,各位高手能否帮助小弟分析一下,谢谢!代码如下:public class Barrier{
private int thread2wait4;
private InterruptedException iex;
public Barrier(int nThreads){
threads2wait4 = nThreads;
}
public synchronized int waitForRest()
throws InterruptedException{
int threadNum = --threads2wait4;
if(iex!=null) throws iex;
if(threads2wait4 <= 0){
notifyAll();
return threadNum;
}
while(threads2wait4 > 0){
if(iex != null) throw iex;
try{
wait();
} catch (InterruptedException ex){
iex = ex;
notifyAll();
}
}
return threadNum;
}
public synchronized void freeAll(){
iex = new InterruptedException("Barrier Released by freeAll");
notifyAll();
}
}疑问如下:
1,书中说"每一个到达屏障的线程都调用wait()方法,而当最后一个线程到达时,就要通知所有等待的线程"对于这一点我能够理解,它又说"如果其中任何一个等待线程收到中断信号,则所有的线程都应该收到同样的中断信号",这句话该怎么理解?2,当调用了wait()方法的线程,收到了notify()通知,并获取了锁以后,要重新执行run方法吗?还是从被中断出继续执行?请各位高手给我这个初学者解答,谢谢!
private int thread2wait4;
private InterruptedException iex;
public Barrier(int nThreads){
threads2wait4 = nThreads;
}
public synchronized int waitForRest()
throws InterruptedException{
int threadNum = --threads2wait4;
if(iex!=null) throws iex;
if(threads2wait4 <= 0){
notifyAll();
return threadNum;
}
while(threads2wait4 > 0){
if(iex != null) throw iex;
try{
wait();
} catch (InterruptedException ex){
iex = ex;
notifyAll();
}
}
return threadNum;
}
public synchronized void freeAll(){
iex = new InterruptedException("Barrier Released by freeAll");
notifyAll();
}
}疑问如下:
1,书中说"每一个到达屏障的线程都调用wait()方法,而当最后一个线程到达时,就要通知所有等待的线程"对于这一点我能够理解,它又说"如果其中任何一个等待线程收到中断信号,则所有的线程都应该收到同样的中断信号",这句话该怎么理解?2,当调用了wait()方法的线程,收到了notify()通知,并获取了锁以后,要重新执行run方法吗?还是从被中断出继续执行?请各位高手给我这个初学者解答,谢谢!
解决方案 »
- xml版的word存到oracle数据库,并且取出来能正确显示
- 两个问题
- java简单的正则表达式如何匹配 “+”?
- 《core java》上的一段代码,能编译,但不能运行,一运行就弹出异常。
- 请问如何对ResultSet或RowSet进行排序
- 一个小问题急急
- 有人玩过 IL2 遗忘的战争 吗?它没有给系统装jvm,但是在自己的游戏目录里面有jvm.dll,java.exe等等,怎么做到这样的打包呢??随便问一
- 如何在一个String中插入一个字符串?
- 在jbuider4中开发applet时,在其中run *.html没有结果是什么原因
- 如何在java中使用jTable显示一条一条信息?谢谢!
- 菜鸟关于JAVA的问题.进者有分(共100分相送).
- 求解正则表达式,匹配用户输入的内容是符合预定类型中哪个类型.
2.从wait的那行开始继续执行
1、作者的意思是说,当共同享一个资源的时候,当其中一个线程收到中断信号,即线程阻塞,那么其它调用该资源的线程也需要wait。否则会形成线程访问顺序错误。
2、调用wait后,现成处与等待状态,好比遇到了红灯,notify()后相当与红灯变绿灯,线程在资源就绪后会自动启动,如果资源被其他线程强占则会形成不稳定状态,抛出错误。