java线程中断,线程为null

时间:2012-08-22 07:28:37

标签: java multithreading

我是线程的新手,我正在尝试复制一个在我的网络应用中中断线程的简单示例。我有下面的类(ComputeResults有其他变量和函数,setter / getters等,但这是我无法工作的新代码):

@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 /名称是不同的。

2 个答案:

答案 0 :(得分:2)

那是因为bean是@RequestScoped - 每个HTTP请求(=按钮点击)都会获得一个新实例。

您至少需要@Scope("session")

答案 1 :(得分:0)

在第一次运行stopRun之前调用了{p> testRun,因此该成员为null。这是因为每个方法调用都发生在一个新实例上。