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

标签 java multithreading abort

主要问题是,在“//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/

相关文章:

c# - 在 C# 中使用数据库值填充 ConcurrentDictionary 的锁定注意事项

bash - 脚本终止后删除文件

java - 如何安全地处理 Java Servlet 过滤器中的密码?

java - Spring Boot 应用程序 - java.lang.OutOfMemoryError : GC overhead limit exceeded 问题

java - 当我们有坐标列表时如何在 JTS 中创建多边形?

Java - 访问for循环内外的变量

java - java中跨进程锁的实现

c++ - 为什么 std::atomic_compare_exchange 更新期望值?

cocoapods - Xcode 8 cocoapods 中止陷阱 : 6

iOS : Background Thread Exceptions Not Crashing