主要问题是,在“//does很多东西下面”中,为什么最初写这个检查的人要检查
if (stopscript)
return;
这真的有帮助吗? Obs 中的 stopscript() 调用是否不能保证线程将被停止?当我读到像 http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html 这样的东西时我不明白工作实际上完成在哪里。在他们的 run() 方法中,我不确定在哪里插入要完成的实际工作。
我有一个 Obs 类,其中有一个本地类脚本编写器,并像这样使用它:
Scripter sscript;
Thread scriptthread;
它具有以下内容(不是整个类),只是其中的一部分::
在 Obs 中实例化 Scripter:
sscript = new Scripter(...);
scriptthread = new Thread(exesscript);
Obsrunning = true;
scriptthread.start();
这些是 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");
}
}
脚本编写器类信息...
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;
}
}
最佳答案
问题和代码细节有点模糊,这使得很难具体理解您所要求的内容和需要帮助的内容,但我会尝试推断。
当类 Scripter
的实例启动时(在 Java 线程上),它将执行 run()
方法中的代码(这是“工作”的地方) '发生)当线程被分配CPU资源时。它像任何其他方法一样运行,如果它返回或完成,则线程完成并且将被清理。
因此如果下面的代码:
if (stopscript)
return;
在run()
方法中调用,如果条件为真,则return
终止run()
方法和线程可以安全地终止和清理(大概,正确性取决于您的程序需要做什么以及您如何处理并发)。
如果您只是在运行 Scripter
实例的线程上调用 stop()
,它会在任何状态下停止它,即它可能处于中途计算或可能无法正确清理其资源使用情况,如您阅读的 Javadoc 中详述。
它本质上使您的程序更难以预测,因为不允许线程正常终止,这(可能)是有问题的。
关于java线程暂停、优雅结束并中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21445303/