0

スタンドアロンで動作するメソッド myFuncs.requestData() があります。データをリッスンするためにサブスクライブし、リスナーがすべてのデータを受信したときに ReadyTxt="TRUE" を設定します。これは複数のコールバックで行われます。

しかし、ボタンにアタッチされている actionPerformed メソッド内で DataReady をチェックしようとすると、設定されていません。なぜなら、myFuncs.requestData() は actionPerformed から抜けた後にのみ処理/実行されるように見えるからです。

「スタンドアロン」とは、##HERE## に関数を配置しない場合、actionPerformed が完了した後に requestData() が機能することを意味します。

実行されていることを確認し、##HERE## の時点で終了するのを待つにはどうすればよいですか?

@Override
public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub
    writePaneln("BUTTON PRESSED "+myFuncs.ReadyTxt);

    myFuncs.requestData();

    try {
        Thread.currentThread().sleep(5000);
    } catch (InterruptedException e) {
    }
    writePaneln("REQUESTED "+myFuncs.ReadyTxt);

            ##HERE##
    }

スレッドバージョン:

@Override
public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub
    writePaneln("BUTTON PRESSED "+myFuncs.ReadyTxt);

            Thread thread = new Thread() {
                    public void run(){
                 myFuncs.requestData();
                    }
    };

    thread.start();

    try {
        Thread.currentThread().sleep(5000);
    } catch (InterruptedException e) {
    }
    writePaneln("REQUESTED "+myFuncs.ReadyTxt);

            ##HERE##
    }

簡略化された requestData():

public void requestData() {

            DataReady="FALSE"
    this.dataSubscription.setListener(this);


}


@Override
public void dataUpdated(List<long> updatedData) {


    if (updatedData.size() <= 1 ){
        this.dataSubscription.destroy();

        writePaneln("In dataUpdated DataReady num: "+Dates.size());
        DataReady="TRUE";
        return;
    }

    for (long l: updatedData){
            writePaneln(l);
        Dates.add(l);
    }


}
4

1 に答える 1

0

答えは、単一のスレッド上にあるように見えるため、actioPerformed が完全に終了した後に TimerTask を使用してタスクの時間を計ることにあるようです。

http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html

于 2013-10-05T08:26:45.783 に答える