Проблема с завершением и запуском потока по новой
От: s3dworld Россия  
Дата: 08.10.12 12:37
Оценка:
Всем доброго дня!

Пишу на Java под Android. Имеется некий класс GameThread, который наследуется от Thread. Он содержит приватную переменную isExit:

public final class GameThread extends Thread
{
    private boolean isExit;


Так же у него есть метод, который позволяет устанавливать состояние работы потока (нужно ли ему продолжать работать или завершаться):

public void setExit(boolean _isExit)
{
    synchronized(this)
    {
        isExit=_isExit;
    }
}


Сама функция потока выглядит следующим образом:

@Override public void run()
{
    boolean isLocalExit;
    synchronized(this)
    {
        isLocalExit=isExit;
    }
    while(!isLocalExit)
    {
        // Начало секретного кода
        // ...
        // Конец секретного кода
        synchronized(this)
        {
            isLocalExit=isExit;
        }
    }
}


Далее есть другой класс GameView, который унаследован от SurfaceView (это уже Android API). В нём я реализовал функцию, которая запускается в момент получения от Activity события onStart():

public void start()
{
    surfaceHolder=getHolder();
    callback=new SurfaceHolder.Callback()
    {
        @Override public void surfaceCreated(SurfaceHolder _surfaceHolder)
        {
            setView();
            gameThread.setExit(false);
            gameThread.start();
        }

        @Override public void surfaceChanged(SurfaceHolder _surfaceHolder,int _i,int _i1,int _i2)
        {
        }

        @Override public void surfaceDestroyed(SurfaceHolder _surfaceHolder)
        {
            try
            {
                gameThread.setExit(true);
                gameThread.join();
                surfaceHolder.removeCallback(callback);
            }
            catch(InterruptedException _exception)
            {
            }
        }
    };
    surfaceHolder.addCallback(callback);
}


Когда Activity стартует, я говорю потоку что он может работать gameThread.setExit(false) и запускаю его gameThread.start(). Когда же поверхность уничтожается (а она уничтожается когда Activity останавливается), то я говорю потоку что ему пора завязывать gameThread.setExit(true) и ожидаю этого завершения gameThread.join(). С этим никаких нареканий нет. Первый запуск и остановка Activity происходит без проблем. Ошибка появляется когда я не по новой запускаю программу, а когда она просто восстанавливается (Activity же запускаются, останавливаются — обычное дело), так то она всё время в памяти висит. И тогда у меня происходит ошибка на строчке:

gameThread.start();


Вот что она гласит:

10-08 12:34:27.629: ERROR/AndroidRuntime(6341): FATAL EXCEPTION: main
java.lang.IllegalThreadStateException: Thread already started.
at java.lang.Thread.start(Thread.java:1045)


То есть поток уже запущен. Это как так, я ведь его завершал и дожидался этого?! Что тут можно придумать?

Спасибо за внимание!

P.S.: выслушаю любые комментарии и замечания по самому ведению кода (архитектуре).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.