Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Остановить цикл, остановить цикл через переменную 
V
    Опции темы
endryha
  Дата 24.3.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



Вообщем такая ситуация. Есть клас, у него есть метод старт и стоп, старт запускает выполнение цыкла по условию (startFlag==true) метод стоп меняет значение startFlag на false... но ниего не происходит и метод старт исполняется дальше как и раньше...

Код

package other;

public class MyClass {
    private boolean startFlag;

    public MyClass() {
        startFlag = false;
    }

    public void start() {
        if (startFlag) {
            throw new IllegalStateException();
        }
        startFlag = true;
        while (startFlag) {
            try {
                Thread.sleep(200);
                System.out.println("MyClass.start()");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void stop() {
        if (!startFlag) {
            throw new IllegalStateException();
        }
        startFlag = false;
    }
}

Хелп...
PM MAIL   Вверх
PovAnd
Дата 24.3.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 20.8.2007

Репутация: нет
Всего: нет



Попробовал запустить такое:

Код

public class MyClass {    
    public static void main(String[] args) throws Exception {
        MyClassTask classTask = new MyClassTask(new MyClass());
        classTask.start();
        Thread.sleep(5000);    
        classTask.stoping();
        System.out.println("end app");
    }
    
    private boolean startFlag;    
    public MyClass() {    
        startFlag = false;    
    }    
    public void start() {    
        if (startFlag) {    
            throw new IllegalStateException();    
        }    
        System.out.println("Start");
        startFlag = true;    
        while (startFlag) {    
            try {    
                Thread.sleep(200);    
                System.out.println("MyClass.start()");    
            } catch (InterruptedException e) {    
                e.printStackTrace();    
            }    
        }    
        System.out.println("I'm  stop");
    }    
    public void stop() {    
        if (!startFlag) {    
            throw new IllegalStateException();    
        }    
        startFlag = false;    
    }    
    
    
}

class MyClassTask extends Thread{
    private MyClass myClass;
    MyClassTask(MyClass myClass){
        this.myClass = myClass;
    }
    public void run(){
        myClass.start();
    }
    
    public void  stoping(){
        myClass.stop();
    }
}



оутпут такой:

Start
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
MyClass work
end app
MyClass work
I'm  stop


Как вывод: именно с тем классом что приведен все Ок, на stop он должет остановиться
PM MAIL   Вверх
endryha
Дата 24.3.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



Конешно пробовал... всеравно почемуто не останавливается...
Что я делаю не так?
Код

public class MyClass {
    private boolean startFlag;

    public MyClass() {
        startFlag = false;
    }

    public void start() {
        if (startFlag) {
            throw new IllegalStateException();
        }
        startFlag = true;
        while (startFlag) {
            try {
                Thread.sleep(100);
                System.out.println("MyClass.start()");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void stop() {
        if (!startFlag) {
            throw new IllegalStateException();
        }
        startFlag = false;
    }
}

Код

public class App {
    public static void main(String[] args) throws Exception {
        ThreadExec t = new ThreadExec(new MyClass());
        t.start();
        Thread.sleep(5000);
        t.stopIt();
    }
}

class ThreadExec extends Thread {
    MyClass executor;

    public ThreadExec(MyClass executor) {
        this.executor = executor;
    }

    public void start() {
        executor.start();
    }

    public void stopIt() {
        executor.stop();
    }
}

PM MAIL   Вверх
PovAnd
Дата 24.3.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 20.8.2007

Репутация: нет
Всего: нет



В твоем примере не так , то что ты запускаешь у класса ThreadExec extends Thread метод start, которым в свою очередь ты заместил start() родительского класса Thread. В итоге у тебя получилось последовательное (а не параллельное как надо) выполнение кода.  если хочешь что бы заработало нужно писать так:

Код

public class App {    
    public static void main(String[] args) throws Exception {    
        ThreadExec t = new ThreadExec(new MyClass());    
        t.start();    
        Thread.sleep(1000);    
        t.stopIt();    
    }    
}    
class ThreadExec extends Thread {    
    MyClass executor;    
    public ThreadExec(MyClass executor) {    
        this.executor = executor;    
    }    
    public void run() {    
        executor.start();    
    }    
    public void stopIt() {    
        executor.stop();    
    }    
}


Т.е. переопределять  метод run() , а start() оставить в покое и только по тихому его заюзать. И тогда все буит ОК ;)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0895 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.