java线程暂停,优雅结束并中止
Posted
技术标签:
【中文标题】java线程暂停,优雅结束并中止【英文标题】:java thread pause, end gracefully and abort 【发布时间】:2014-01-30 00:00:00 【问题描述】:主要问题是在“//在下面做了很多事情”中,为什么最初编写此检查的人
if (stopscript)
return;
这真的有什么帮助吗?来自 Obs 的 stopscript() 调用不保证线程将被停止吗?当我读到http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html 之类的东西时,我不知道实际工作在哪里。在他们的 run() 方法中,我不确定在哪里插入要完成的实际工作。
我有一个类 Obs,其中我有一个本地 Class Scripter 并像这样使用它:
Scripter sscript;
Thread scriptthread;
它有以下(不是整个类),只是它的一部分::
在 Obs 中实例化 Scripter:
sscript = new Scripter(...);
scriptthread = new Thread(exesscript);
Obsrunning = true;
scriptthread.start();
这些是 Obs 中的其他方法,当单击 STOP 或 END 按钮时调用。
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;
【问题讨论】:
问题:这段代码是否使用诸如 Swing 之类的 GUI 库运行(我看到您正在调用setText(...)
)?此外,您将希望学习 Java 命名约定并尝试遵守它们,尤其是在发布代码供他人(我们!)阅读、审查、理解和帮助您时,因为不遵守这些规则会使您变得更难为了我们。请注意,变量和方法名应以小写字母开头,类名应以大写字母开头。
如果是我的,我会在这段代码中进行很多更改。我可能会也可能不会被允许这样做。这段代码绝不是传统的。对不起,如果这对你们来说更难,谢谢你的尝试。
【参考方案1】:
问题和代码细节有点模糊,很难非常具体地理解您的要求和需要帮助,但我会尝试推断。
当您的类Scripter
的实例启动时(在Java 线程上),当线程被分配CPU 资源时,它将执行run()
方法中的代码(这是“工作”发生的地方)。它像任何其他方法一样运行,如果它返回或完成,则线程已完成并将被清理。
因此如果下面的代码:
if (stopscript)
return;
在run()
方法中被调用,那么如果该条件为真,return
将终止run()
方法并且线程可以安全地终止和清理(大概,正确性取决于您的程序需要做什么和你是如何处理并发的)。
如果您只是在运行Scripter
实例的线程上调用stop()
,它会在它所处的任何状态下停止它,即它可能是计算的中途,或者可能无法正确清理其资源使用情况您阅读的 Javadoc 中有详细说明。
它本质上使您的程序更难预测,因为不允许线程优雅地终止,这(可能)是有问题的。
【讨论】:
谢谢。我认为这就是我想要的,让我放心,如果返回将它带回到我的主要方法的末尾,我可以调用 cleanup() 并退出。我仍然有一些麻烦,状态仍然是活跃的。但我正在通过代码找到所有路径,并确保我允许礼貌地停止工作。谢谢。以上是关于java线程暂停,优雅结束并中止的主要内容,如果未能解决你的问题,请参考以下文章