2014-01-30 3 views
0

Главный вопрос заключается в том, что в «// делает много вещей ниже» почему человек, который первоначально написал эту проверкуJava нить пауза, конец грациозно и прервать

if (stopscript) 
    return; 

Будет ли это на самом деле помочь что-нибудь? Разве вызов stopcript() от Obs не гарантирует, что поток будет остановлен? Когда я читаю такие вещи, как http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html, я не понимаю, где эта работа действительно выполняется. В методах run() я не уверен, где бы я вставлял текущую работу.

У меня есть класс Obs, в котором у меня есть местный класс Scripter и использовать его как это:

Scripter sscript; 
Thread scriptthread; 

Он имеет следующие (не весь класс), только биты него ::

Инстанцирования из Scripter в Obs:

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

Эти и другие методы в Obs, которые вызываются, когда СТОП или 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; 
    } 
} 
+0

Вопрос: этот код работает с графической библиотекой, такой как Swing (я вижу, вы вызываете 'setText (...)')? Кроме того, вы захотите изучить соглашения об именах Java и попытаться придерживаться их, особенно при публикации кода для других (нас!), Чтобы читать, просматривать, понимать и помогать вам, поскольку, не соблюдая эти правила, вы делаете это сложнее для нас. Обратите внимание, что имена переменных и методов должны начинаться с строчных букв и имен классов с буквой в верхнем регистре. –

+0

В этом коде есть много изменений, если бы оно было моим. Я мог бы или не был бы допущен к этому. Этот код ничего, кроме обычного. Извините, если вам тяжело ребята и спасибо за попытку. – evernoob

ответ

1

Вопросительные и код детали немного неопределенны, что делает его трудно понять очень конкретно, что вы просите, и нужна помощь, но я Я попытаюсь сделать вывод.

Когда запускается экземпляр вашего класса Scripter (в потоке Java), он выполнит код в методе run() (здесь происходит «работа»), когда потоку выделены ресурсы ЦП. Он работает как любой другой метод, и если он вернется или завершится, поток завершится, и он будет очищен.

Таким образом, если следующий код:

if (stopscript) 
    return; 

вызывается в run() методом, а затем, если это условие истинно, то return завершает метод run() и нить может завершить и очистить безопасно (по-видимому, правильность зависит о том, что ваша программа должна делать и как вы обрабатываете параллелизм).

Если вы только что вызвали stop() в потоке, запущенном экземпляром Scripter, он останавливает его в любом состоянии, то есть он может быть на полпути через расчет или может неправильно очищать его использование ресурсов, как описано в Джавадок вы читали.

Это, по сути, делает вашу программу менее предсказуемой, потому что нить не допускается изящно, а это (может быть) проблематично.

+0

Спасибо.Я думаю, что это то, что я хотел, некоторые уверения в том, что если возвращение вернет его к концу моего основного метода, выполняющего эту работу, я могу вызвать cleanup() и выйти. У меня все еще есть проблемы, когда состояние все еще активно. но я нахожу все пути через код и убедившись, что я допускаю вежливый способ прекратить работу. Благодарю. – evernoob