Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/50: Рейтинг темы: голосов - 50, средняя оценка - 4.98
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
1

Завершение потока

13.04.2013, 23:10. Показов 9082. Ответов 34
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо корректно завершить поток.
Сейчас код такой
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class MyThread extends Thread
{
    private void method() throws InterruptedException
    {
        ...
    }
 
    public void run()
    {
        while(!isInterrupted())
        {
             try
             {
                 method();
                 super.sleep(...);
             }
             catch (Exception ex)
             {
                 ...
             }
        }
    }
}
То есть при любом исключении в потоке оно будет поймано.
Далее будет проверка на isInterrupted и если было прерывание, то поток завершится.
Но складывается впечатление, что поток вылетает. Не могу поймать где.

Правильно ли завершение потока ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2013, 23:10
Ответы с готовыми решениями:

Завершение потока AsyncTask
Доброго времени суток. Возникла проблема с закрытием потока. Первый раз код выполняется и все норм,...

Завершение потока
Проблема в том что, при закрытии приложения поток остаётся работать, и следовательно при повторном...

завершение потока
как завершить поток до конца выполнении его работы? делаю так methread.terminated но не...

Завершение потока
У меня запущен поток: Thread load = new Thread(check); load.Start(); Но если поток...

34
0x5B4C322291BD52AE
96 / 96 / 0
Регистрация: 04.03.2013
Сообщений: 295
13.04.2013, 23:18 2
xbarmaglot, у меня другой вопрос ты это делаешь в сервисе если да то зачем?
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
13.04.2013, 23:21  [ТС] 3
Цитата Сообщение от c4sp3r Посмотреть сообщение
xbarmaglot, у меня другой вопрос ты это делаешь в сервисе если да то зачем?
да, в сервисе. Не хотел предыдущую тему захламлять.
А делаю, т.к. нужны регулярные действия, которые долгие.
Чтоб не вещать главный поток, то запускаю отдельный
0
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 101
13.04.2013, 23:22 4
в чем проблема завершить его с помощью флага в любой нужный для тебя момент?
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
13.04.2013, 23:26  [ТС] 5
Цитата Сообщение от metrolog Посмотреть сообщение
в чем проблема завершить его с помощью флага в любой нужный для тебя момент?
раньше так и делал, но где-то меня переубедили, что interrupt единственное правильное решение.
А для флага нужно еще и заводить свой метод остановки.

Добавлено через 1 минуту
И флаг не прервет sleep и все wait-функции
0
0x5B4C322291BD52AE
96 / 96 / 0
Регистрация: 04.03.2013
Сообщений: 295
13.04.2013, 23:26 6
xbarmaglot, сервис и так в отдельном потоке работает и расчитан чтобы в нем делать долгую работу нет надобности порождать еще потоки это не рекомендуется. После того как он выполнил работу он завершается если тебе переодически нужно его запускать используют AlarmManager.
0
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 101
13.04.2013, 23:26 7
все время пользуюсь флагом, метод же не проблема сделать, да и вы можете в любой момент сами остановить поток.
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
13.04.2013, 23:29  [ТС] 8
Цитата Сообщение от c4sp3r Посмотреть сообщение
xbarmaglot, сервис и так в отдельном потоке работает и расчитан чтобы в нем делать долгую работу нет надобности порождать еще потоки это не рекомендуется. После того как он выполнил работу он завершается если тебе переодически нужно его запускать используют AlarmManager.
А вот не хотелось бы чтоб он вообще останавливался

Добавлено через 28 секунд
Цитата Сообщение от metrolog Посмотреть сообщение
все время пользуюсь флагом, метод же не проблема сделать, да и вы можете в любой момент сами остановить поток.
ну а как с sleep и wait-функциями ?
0
0x5B4C322291BD52AE
96 / 96 / 0
Регистрация: 04.03.2013
Сообщений: 295
13.04.2013, 23:32 9
Цитата Сообщение от xbarmaglot Посмотреть сообщение
А вот не хотелось бы чтоб он вообще останавливался
Он останавливается только в крайнем случае и с помощью того же AlarmManager можно его снова запустить (в случае критической оставки).
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
13.04.2013, 23:41  [ТС] 10
Тогда объясню подробнее.
Служба обрабатывает входящие события. При этом сохраняет данные.
Запускаются при этом 2 потока.
Один архивирует данные. Он запускается раз в час. Это может занять несколько секунд.
Второй, запускается раз в 10 минут. Он отправляет архивированные данные на почту - это может занять несколько минут.

При этом блокировать основной поток сервиса нельзя, т.к. может прийти событие на обработку.
Вот я и запускаю потоки.
Но складывается впечатление, что потоки вылетают. Причем в отладке не видно этого.
А причина - нет регулярной работы потоков. Видно по отосланным данным и времени создания архивов.

Вот и вопрос - правильно ли я останавливаю поток. Или в моем коде есть ошибка, которая может
привести к остановке потока.
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
14.04.2013, 16:42 11
Цитата Сообщение от c4sp3r Посмотреть сообщение
xbarmaglot, сервис и так в отдельном потоке работает и расчитан чтобы в нем делать долгую работу нет надобности порождать еще потоки это не рекомендуется. После того как он выполнил работу он завершается если тебе переодически нужно его запускать используют AlarmManager.
оО
С каких это пор???

Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise).


xbarmaglot, почему бы не использовать AsynkTask для этого?
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
14.04.2013, 17:21  [ТС] 12
Цитата Сообщение от YuraAAA Посмотреть сообщение
оО
С каких это пор???

Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise).


xbarmaglot, почему бы не использовать AsynkTask для этого?
А в чем разница ? Да я так и не понял как AsynkTask периодически запускать...
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
14.04.2013, 19:28 13
Для этого можно использовать TimerTask.

Смотрите. Каркас асинхронной задачи:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class PerformBackgroundTask extends AsyncTask<Integer, Void, Void>{
 
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //Вызывается перед началом исполнения
    }
    
    @Override
    protected Void doInBackground(Integer... params) {
        //Сам поток "исполнения"
        //TODO:
        return null;
    }
    
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        //Вызывается после исполнения
    }
    
}
Вызов:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void callAsynchronousTast(){
        final Handler handler = new Handler();
        Timer timer = new Timer();
        TimerTask doAsynchronousTask = new TimerTask() {       
            @Override
            public void run() {
                handler.post(new Runnable() {
                    public void run() {       
                        try {
                            PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask();
                            performBackgroundTask.execute();
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                        }
                    }
                });
            }
        };
        timer.schedule(doAsynchronousTask, 0, 50000); //Выполнение каждые 50 секунд (50000 милисекунд)
        
    }
0
0x5B4C322291BD52AE
96 / 96 / 0
Регистрация: 04.03.2013
Сообщений: 295
14.04.2013, 19:35 14
Цитата Сообщение от YuraAAA Посмотреть сообщение
оО
С каких это пор???
Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise).
Ты прав! Я просто в основном использую IntentService и предположил что ТС тоже его использует это конечно моя ошибка нужно было уточнить этот момент.

The IntentService does the following:
Creates a default worker thread that executes all intents delivered to onStartCommand() separate from your application's main thread.
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
14.04.2013, 19:51 15
c4sp3r, а, ну да, затупил. Конечно проще такой сервис использовать, чем возиться с асинхронностью)
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
14.04.2013, 20:34  [ТС] 16
YuraAAA, а зачем Handler. Разве нельзя просто запустить TimerTask?

Добавлено через 38 минут
Все, понял как сделать.
Остался только один вопрос - если я запускаю задачу каждую минуту,
а задача выполняется дольше чем минута, то будет создана вторая задача, которая будет
делить ресурсы с первой.

А хотелось бы, чтобы вторая задача не запускалась, если первая уже запущена и не отработала.
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
14.04.2013, 20:56 17
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void callAsynchronousTast(long delay){
        final Handler handler = new Handler();
        Timer timer = new Timer();
        TimerTask doAsynchronousTask = new TimerTask() {       
            @Override
            public void run() {
                handler.post(new Runnable() {
                    public void run() {       
                        try {
                            PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask();
                            performBackgroundTask.execute();
                        } catch (Exception e) {
                           
                        }
                    }
                });
            }
        };
        timer.schedule(doAsynchronousTask, delay);
        
    }
И вызываем этот метод из асинхронной задачи.

Java
1
2
3
4
5
@Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        //TODO: callAsynchronousTast(0) - run immediately
    }
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
14.04.2013, 21:00  [ТС] 18
Цитата Сообщение от YuraAAA Посмотреть сообщение
И вызываем этот метод из асинхронной задачи.
Не понял зачем ?

P.S. Да и так проще
Java
1
2
3
4
5
6
7
8
9
        m_timer.schedule(new TimerTask()
        {
            @Override
            public void run()
            {
                WorkAsyncTask task = new WorkAsyncTask(...);
                task.execute();
            }
        }, 0, 10 * 60 * 1000);
Или handler.post имеет какой-то смысл ?
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
14.04.2013, 21:51 19
Если Вы не работаете с UI из этого потока, то можно выкинуть handler.

Вызывать асинхронную задачу регулярно, через определённый промежуток времени - не есть гуд. Ведь как я понял, задача должна точно окончиться, перед тем как снова запустится? По-этому, лучше вызывайте асинхронную задачу из неё же. Но это моё личное мнение, может я и не прав
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
14.04.2013, 21:54  [ТС] 20
Цитата Сообщение от YuraAAA Посмотреть сообщение
Если Вы не работаете с UI из этого потока, то можно выкинуть handler.
А запуск задачи можно производить не с Main потока ?

Цитата Сообщение от YuraAAA Посмотреть сообщение
Вызывать асинхронную задачу регулярно, через определённый промежуток времени - не есть гуд. Ведь как я понял, задача должна точно окончиться, перед тем как снова запустится? По-этому, лучше вызывайте асинхронную задачу из неё же. Но это моё личное мнение, может я и не прав
Поэтому я и использовал изначально поток
0
14.04.2013, 21:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2013, 21:54
Помогаю со студенческими работами здесь

Завершение потока
Здравствуйте! На этот раз у меня вопрос про потоки. Как мне в определенном процессе завершить...

Завершение потока.
Как принудительно (то бишь моментально) завершить (то бишь с вызовом OnTerminate и освобождением...

Завершение потока
Как завершить поток из main чтобы все потом нормально было???

Завершение потока
Здравствуйте! Вопрос такой, как сделать так, чтобы поток завершался по условию? Вот например:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru