私はスレッドが初めてで、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/名前が違うようです。