Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java线程暂停、优雅结束和中止_Java_Multithreading_Abort - Fatal编程技术网

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()并退出。我仍然有一些麻烦,因为州政府仍然活跃。但我正在寻找代码中的所有路径,并确保我允许以礼貌的方式停止工作。谢谢