1

我只是无法弄清楚这个问题的原因。

问题 :

1) 我正在使用 Thread.Sleep 函数为我的应用程序设置计时器。

2)现在,一旦用户进入网页,计时器就会启动,如果用户点击任何链接,计时器(线程)就会停止,然后新的计时器就会启动。

3)如果他们在 3 秒内没有活动,则计时器结束,与网页相关的工作流程也随之结束。

代码 :

下载SummariesPage.java

public DownloadSummariesPage(){

 abc = new SimpleThread(this);

Link<Void> link = new Link<Void>("downloadSummaryLink") {

public void onClick() {

                    boolean threadStatus = abc.checkStatus();

                    if (threadStatus) {
                        abc.interrupt();
                        abc.stop();
                        abc = new SimpleThread(DownloadSummariesPage.this);
                        abc.start();
                        } 
                    else 
                        {
                        LOG.debug("thread is dead now");
                        endWorkflow();
                        LOG.debug("ending the workflow");
                        setResponsePage(MenuPage.class);                        
                        }
                     }

};
abc.start();
}


public void endWorkflow() {
    abc.interrupt();
    abc.stop();
    boolean downloadReport = false;
    LOG.debug("before action 201 inside endworkflow");
    Map<String, Serializable> inputs = new HashMap<String, Serializable>();
    inputs.put("downloadReport", downloadReport);
    try {
        wf.doAction(id, 201, inputs);//do not worry about this its for workflow
        String empty = "";
        populateDownloadReportDatabase(empty);

        setResponsePage(MenuPage.class);
    } catch (Exception e) {
        LOG.debug("Exception while performing 201 workflow, getControlCancel "
                + e);
    }
}
}

我的下一个创建线程的类是 SimpleThread.java

class SimpleThread extends Thread {
private static final Logger LOG = Logger.getLogger(SimpleThread.class);

boolean stillActive = true;
DownloadSummariesPage dsp;

SimpleThread(DownloadSummariesPage dp) {
    this.dsp = dp;
}

public void run() {
    // 5sec timer
    LOG.debug("inside run method");
    try {
        Thread.sleep(3000);
        stillActive = false;
    } catch (InterruptedException e) {
        LOG.debug("Exception in thread " + e);
        e.printStackTrace();
    }
    LOG.debug("before endworkflow");
    dsp.endWorkflow();//so this is what i actually want to do...
    LOG.debug("at the end of simplethread");

}

public boolean checkStatus() {
    return stillActive;
}
}

案例:

1)发生了什么:用户登录线程休眠,用户单击链接线程停止并创建一个新链接,如果用户再次单击它再次发生,现在如果用户在 3 秒内不做任何事情,SimpleThread 类中的 stillAlive 变量设置为 false当现在用户点击它时,它完美地结束了工作流程......

2)我想要什么:如果用户登录线程启动,并且如果用户没有活动,则仍然Alive变量设置为false,并且dsp.endWorkflow(); 语句现在应该结束工作流程。正确的 ?但它只是在到达endWorkflow()函数内部后停止,实际上并没有结束工作流程......

希望你明白这一点,我尽我所能使其易于理解。谢谢你的时间..

我很感激任何帮助..

4

1 回答 1

1

所以这里有一些奇怪的事情。
首先假设线程在没有任何中断的情况下休眠 3 秒,因此它将调用dsp.endWorkflow()您从onClick方法中再次调用它的位置。

第二个stillAlive标志应该是volatile

boolean volatile stillActive = true;

本节将引发可能的错误/错误。

if (threadStatus) {
abc.interrupt();
abc.stop();// you cannot get to this like just after interrupt, maybe thread abc goes first
abc = new SimpleThread(DownloadSummariesPage.this);
abc.start();
} 

因为假设当线程处于睡眠状态时你中断它,然后停止它,但是线程可能在你中断它之后(在你停止它之前)完成它的工作。所以最好只是停止它,或者return当线程到达捕获时。

    try {
        Thread.sleep(3000);
        stillActive = false;
    } catch (InterruptedException e) {
        LOG.debug("Exception in thread " + e);
        e.printStackTrace();
        return;//////give up the rest work. so you don't need to call the stop too.
    }

错误在这里假设用户没有单击取消或新下载,并且线程刚刚完成其睡眠并调用dsp.endWorkflow(),那么这个方法是怎么回事?

public void endWorkflow() {
    abc.interrupt();
    abc.stop();//error here!
    boolean downloadReport = false;//this is unreachable
}

看看,你是按abc线程调用这个方法的,错误是你正在杀死方法内部的线程,在你设置downloadReportto之前false。所以它可能是这样的。

public void endWorkflow() {
    boolean downloadReport = false;//this is unreachable
    abc.interrupt();
    abc.stop();//error here!
}

我希望我能有所帮助。

于 2013-10-29T18:43:14.597 回答