java线程暂停,优雅结束并中止

时间:2014-01-30 00:00:00

标签: java multithreading abort

主要问题是在“//下面有很多东西”中为什么最初写这张支票的人

if (stopscript)
    return;

这实际上会有所帮助吗?来自Obs的stopscript()调用是否保证线程将被停止?当我读到诸如http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html之类的东西时,我无法完成工作的实际工作。在他们的run()方法中,我不确定在哪里插入要完成的实际工作。

我有一个类Obs,其中我有一个本地类Scripter并使用它像这样:

Scripter sscript;
Thread scriptthread;

它有以下(不是全班),只是它的一部分::

Obs中的Scripter实例化:

   sscript = new Scripter(...);
   scriptthread = new Thread(exesscript);
   Obsrunning = true;
   scriptthread.start();

这些是在单击STOP或END按钮时调用的Obs中的其他方法。

public void stopscript()
{
    sscript.stopscript();

    if (obssequencepaused)
    {
        sscript.resumescript();
        JBpause.setText("PAUSE");
    } 
   sscript = null;


}

public void endscript()
{

    sscript.endscript();

    if (obssequencepaused)
    {
        sscript.resumescript();
        JBpause.setText("PAUSE");
    }
}

Scripter类信息......

public class Scripter implements Runnable
{

    @Override
    public void run()
    {
        //does lots of stuff
    }

    final public void stopscript()
    {
        this.stopscript = true;
        scriptthread.interrupt();
    }

    final public void pausescript()
    {
        this.pausescript = true;
    }

    final public void resumescript()
    {
        this.pausescript = false;
    }

    // sets parameters so loops should just fall through and main run() finishes
    final public void endscript()
    {

        endscript = true;
        numpositions = 0;
        firstRepeats = 1;
        repeats = 1;
    }
}

1 个答案:

答案 0 :(得分:1)

问题和代码细节有点模糊,这使得很难明确地理解你的要求并需要帮助,但我会试着推断。

当启动类Scripter的实例(在Java线程上)时,它将执行run()方法中的代码(这是'work'发生的地方)分配了CPU资源。它像任何其他方法一样运行,如果它返回或完成,那么线程就完成了,它将被清理。

因此,如果以下代码:

if (stopscript)
    return;
run()方法中调用

,如果该条件为真,则return终止run()方法,并且线程可以安全终止和清理(可能,正确性取决于什么你的程序需要做什么以及你如何处理并发)。

如果你只是在运行stop()实例的线程上调用Scripter,它会在它所处的任何状态下停止它,即它可能是计算的一半,或者可能无法正常清理它的资源使用情况详见您阅读的Javadoc。

它本质上使你的程序不太可预测,因为不允许线程优雅地终止并且(可能)有问题。