如何在主线程

时间:2018-03-17 08:53:25

标签: java multithreading wait

我目前正在开发基于Thread并使用waitnotify的一些课程,我对如何在多个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部分,那么它将是两个“通知”在一种堆栈中,或者我会丢失一些“通知”?

希望这很清楚,我对这种方法很新,对我来说有点难。

谢谢。

0 个答案:

没有答案