Как остановить асинхронный поток после 5 секунд работы - PullRequest
0 голосов
/ 25 ноября 2010

Нужно создать поток и запустить его в течение 5 секунд, затем я хочу остановиться. Как я могу это сделать?

Я ничего не могу сделать со временем / миллисекундами.

THX.

Ответы [ 3 ]

3 голосов
/ 25 ноября 2010

Threading в Java является кооперативным - вы не можете принудительно остановить поток.Что вы можете сделать, это дать сигнал об остановке (вызвать прерывание () или поднять флаг), а затем код охотно останавливается.

Итак:

  1. Запустите работниканить.Внутри него многократно (внутри основного рабочего цикла) проверьте isInterrupted() И поймайте любое InterruptedExceptions - в этом случае выйдите из потока.

  2. Запустите TimerTask для запуска в течение 5 секунд, затемвызовите interrupt() в рабочем потоке.

Обновление: Постер объяснил, что у него уже есть рабочий код, ему просто нужно запустить его асинхронно, не блокируя пользовательский интерфейс.

Решение: настройте AsyncTask и запустите свой код в методе doInBackground().

2 голосов
/ 25 ноября 2010

Используйте метод AsyncTask.cancel(true).

0 голосов
/ 25 ноября 2010

Извините, что здесь не ясно. Вот пример, который я имею для синхронного потока. Моя функция listen () работает в течение 5 секунд, затем завершается. Listen () - прослушиватель UDP ...

Проблема с этим кодом, он останавливает мой основной поток (мой телефон перестал отвечать на запросы) до тех пор, пока list () не завершит 5-секундный запуск. Я хотел бы использовать асинхронный поток, чтобы избежать зависания телефона. Когда я сказал, что ничего не могу сделать со временем, я пытался сказать, что я не могу установить какой-либо таймер в функцию listen (), затем измерить истекшее время и выйти через 5 секунд. Не могу этого сделать.

Thread t = new Thread() {
    public void run() {
        try {
            listen();
        } catch (IOException e) {
            Log.d(TAG, "IOException (Discovery) " + e);
            e.printStackTrace();
        }
        synchronized (this) {
            notifyAll();
        }
    }
};
synchronized (t) {
    t.start();
    try {
        t.join(5000); // 5 sec

    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...