2014-01-30 38 views
0

的主要问题是,内“//做大量的下方东西”为什么谁最初写这个检查Java线程暂停,结束优雅并中止

if (stopscript) 
    return; 

的人会实际上什么帮助? Obs的stopscript()调用不会保证线程将被停止?当我读到像http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html这样的东西时,我并没有得到实际完成工作的地方。在他们的run()方法中,我不确定在哪里插入要完成的实际工作。

我有一个类观测数据中,我有一个本地类的编剧和使用它像这样:

Scripter sscript; 
Thread scriptthread; 

它具有以下(不整类),只是它位::

实例化的编剧的内观测值:

sscript = new Scripter(...); 
    scriptthread = new Thread(exesscript); 
    Obsrunning = true; 
    scriptthread.start(); 

这些是OB的其它方法被点击停止或结束按钮时被调用。

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; 
    } 
} 
+0

问题:这段代码是否运行了一个GUI库,如Swing(我看到你正在调用'setText(...)')?此外,您还需要了解Java命名约定并尝试坚持使用它们,特别是在发布其他人(我们!)的代码来阅读,审阅,理解和帮助您时,由于不遵守这些规则,您会使其更难为了我们。请注意,变量和方法名称应以小写字母和类名开头,并带有大写字母。 –

+0

如果是我的,我会在这段代码中改变很多。我可能会或可能不会这样做。这个代码不是传统的。对不起,如果这对你们来说更加困难,并且感谢你的尝试。 – evernoob

回答

1

的问题和代码的细节是有点模糊,这使得它很难非常明确你所要求的理解和需要帮助,但我我会尝试推断。

当您Scripter类的实例启动(在Java线程),它将在run()方法执行代码(这是在“工作”发生),当线程分配CPU资源。它像任何其他方法一样运行,如果它返回或完成,则线程完成并将清理。

因此,如果下面的代码:

if (stopscript) 
    return; 

被称为在run()方法,那么,如果该条件为真,则return终止run()方法和线程可以终止,安全地清理(据推测,正确性取决于你的程序需要做什么以及你如何处理并发)。

如果你只需要调用运行Scripter实例的线程上stop(),它停止它在什么状态时,它是在IE中它可能是中途通过计算或可能无法正常清理其资源使用如在详细你读过的Javadoc。

它实质上使得你的程序不太可预测,因为线程不允许优雅地终止并且是(可能)有问题。

+0

谢谢。我认为这是我想要的,有些人会保证,如果回报让我回到我的主要方法的最后,我可以在那里调用cleanup()并退出。我仍然有一些麻烦,那里的状态仍然活跃。但我通过代码找到了所有的路径,并确保我允许有礼貌的停下来工作。谢谢。 – evernoob