0

私はスレッドが初めてで、Web アプリでスレッドを中断する簡単な例を再現しようとしています。以下のクラスがあります(ComputeResultsには他の変数と関数、セッター/ゲッターなどがありますが、これは私が動作できない新しいコードです):

@ManagedBean(name="results")
@RequestScoped
public class ComputeResults implements Serializable{

    Thread scan;
    public void testrun() {
    scan = new Thread(new Runnable() {
        @Override
        public void run() {
            int i = 0;
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    i++;
                    if (i == 1) {
                        scan.interrupt();
                    }
                } 
                catch (Exception e) {
                    Thread.currentThread().interrupt();
                }
                catch (Throwable t) {
                    System.out.println("Thrown test: "+t.getMessage());
                }
            }
        }
    });

    scan.start();
}

    public void stoprun() {
        if(scan != null){
            scan.interrupt();
        }
    }
}

私のインターフェイスには、スレッドを開始するためのボタンがあります。

<p:commandLink action="submit" value="" onclick="testdialog.show()" oncomplete="testdialog.hide()" actionListener="#{results.testrun}" update="messages, runmsg, @form results" />

そしてそれを中断しようとするもの:

<p:commandButton action="submit" value="Cancel Test" onclick="testdialog.hide()" actionListener="#{results.stoprun}" update="messages, runmsg" />

問題は、'stoprun' 関数が 'scan' を null として認識し、その理由がわかりません。testrun() 内に scan.interrupt() を追加すると正常に動作します。Thread.currentThread().interrupt() を使おうと思ったのですが、stoprun を呼び出すと現在のスレッド ID/名前が違うようです。

4

2 に答える 2

2

これは、Bean が@RequestScoped- 各 HTTP リクエスト (= ボタンのクリック) が新しいインスタンスを取得するためです。

@Scope("session")少なくとも作る必要があります。

于 2012-08-22T07:34:52.597 に答える
0

stopRunへの最初の実行の前に呼び出されたtestRunため、メンバーはnullです。これは、各メソッド呼び出しが新しいインスタンスで発生するためです。

于 2012-08-22T07:36:30.187 に答える