java线程暂停、优雅结束和中止
主要的问题是“//做了很多事情”为什么最初写这张支票的人java线程暂停、优雅结束和中止,java,multithreading,abort,Java,Multithreading,Abort,主要的问题是“//做了很多事情”为什么最初写这张支票的人 if (stopscript) return; 这真的会有帮助吗?来自Obs的stopscript()调用不保证线程将停止吗?当我读到像这样的东西时,我不知道工作到底在哪里完成。在他们的run()方法中,我不确定将要完成的实际工作插入何处 我有一个类Obs,其中我有一个本地类脚本编写器,并像这样使用它: Scripter sscript; Thread scriptthread; 它有以下内容(不是整个类),只是其中的一部分:
if (stopscript)
return;
这真的会有帮助吗?来自Obs的stopscript()调用不保证线程将停止吗?当我读到像这样的东西时,我不知道工作到底在哪里完成。在他们的run()方法中,我不确定将要完成的实际工作插入何处
我有一个类Obs,其中我有一个本地类脚本编写器,并像这样使用它:
Scripter sscript;
Thread scriptthread;
它有以下内容(不是整个类),只是其中的一部分:
Obs中脚本程序的实例化:
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线程上),当线程被分配CPU资源时,它将执行run()
方法中的代码(这是“工作”发生的地方)。它与任何其他方法一样运行,如果它返回或完成,那么线程就完成了,它将被清理
因此,如果以下代码:
if (stopscript)
return;
在run()
方法中调用,如果该条件为真,则return
终止run()
方法,线程可以安全地终止和清理(可能正确性取决于程序需要做什么以及如何处理并发)
如果您只是在运行Scripter
实例的线程上调用stop()
,它会在任何状态下停止该实例,即,它可能正在进行计算,或者可能无法按照您阅读的Javadoc中的详细说明正确清理其资源使用情况
它本质上降低了程序的可预测性,因为不允许线程正常终止,这(可能)是有问题的。问题:此代码是否使用Swing之类的GUI库运行(我看到您正在调用
setText(…)
)?此外,您还需要学习Java命名约定并努力遵守这些约定,特别是在为他人(我们!)发布代码以阅读、审阅、理解和帮助您时,因为不遵守这些规则会使我们更加困难。请注意,变量名和方法名应该以小写字母开头,类名应该以大写字母开头。我可能被允许这样做,也可能不被允许这样做。这个代码根本不是传统的。很抱歉,如果这对你们来说更难,谢谢你们的努力。谢谢。我想这就是我想要的,如果返回将它带回到我的主要方法完成工作的末尾,那么我可以调用cleanup()并退出。我仍然有一些麻烦,因为州政府仍然活跃。但我正在寻找代码中的所有路径,并确保我允许以礼貌的方式停止工作。谢谢