我目前正在开发基于Thread
并使用wait
和notify
的一些课程,我对如何在多个wait
处理它时遇到问题触发了。
我有这个方法
private void fillBlocks(){
ASCIIDataStream ads = new ASCIIDataStream(this.getRawCode());
ASCIIDataStream aux = new ASCIIDataStream("");
DataStream<?, ?>[] bds = null;
if((ads.getProcessedChars() < this.BLOCK_LENGTH) && (!ads.isDone())){
try{
ads.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
bds = this.divide(ads, this.BLOCK_LENGTH, Balance.LEFT, Format.BIN);
this.blocks.add(bds[0]);
this.notify();
aux = (ASCIIDataStream)bds[1];
do{
bds = this.divide(aux, this.BLOCK_LENGTH, Balance.LEFT, Format.BIN);
this.blocks.add(bds[0]);
aux = (ASCIIDataStream)bds[1];
}while(bds[1] instanceof DataStream<?, ?>);
}
来自ads
的触发notify
的方法:
private synchronized boolean feed(Character c){
if(super.addOutput(c))
this.processedChars++;
else
return false;
if((this.processedChars % this.threshold == 0) && (this.processedChars > 0))
this.notify();
return true;
}
所以,总而言之,ads
根据输入生成一些数据块,主类需要wait
直到块完成,所以我需要放一些{{1}在wait
区块......
do
所以,我的问题是,如果 do{
bds = this.divide(aux, this.BLOCK_LENGTH, Balance.LEFT, Format.BIN);
this.blocks.add(bds[0]);
aux = (ASCIIDataStream)bds[1];
//make some waiting here
}while(bds[1] instanceof DataStream<?, ?>);
触发(例如)两个ads
而主要类仍未到达notify
部分,那么它将是两个“通知”在一种堆栈中,或者我会丢失一些“通知”?
希望这很清楚,我对这种方法很新,对我来说有点难。
谢谢。