Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2015, 22:16   #1
[CODER]
Форумчанин
 
Аватар для [CODER]
 
Регистрация: 02.02.2010
Сообщений: 305
По умолчанию Приостановка выполнения дочернего потока?

В классе ChildrenThread нужно реализовать методы для приостановки и продолжения выполнения потока. Приведенный мной пример, очень утрирован относительно реальной задачи. Метод run() выполняется очень долго и у пользователя может возникнуть необходимость приостановить его работу, независимо от этапа выполнения задачи...


Пробовал сделать так:
Код:
class ChildrenThread extends Thread {

    private volatile boolean play = true;

    @Override
    public void run() {
        int i = 0;
        while (!isInterrupted()) {
            System.out.println(i++);
        }
    }

    public synchronized void play() {
        play = true;
        notify();
    }

    public synchronized void pause() {
        play = false;
        while (!play) {
            try {
                wait();
            } catch (InterruptedException ex) {
            }
        }
    }
}

Пример использования:
Код:
public static void main(String[] args) throws InterruptedException {
    ChildrenThread th = new ChildrenThread();

    th.start();
        Thread.sleep(100);

    th.pause();
        Thread.sleep(5000); 

    th.play();
        Thread.sleep(50);

    th.pause();
        Thread.sleep(10000);

    th.play();
    th.interrupt();
}
В этом примере, выполнение главного потока останавливается при первом вызове pause() дочернего потока, а сам дочерний поток продолжает выполнение.

Как сделать так, чтобы при вызове pause(), приостанавливал свою работу дочерний поток и продолжал ее после вызова метода play()?
Skype: CODERua

Последний раз редактировалось [CODER]; 26.11.2015 в 13:02.
[CODER] вне форума Ответить с цитированием
Старый 26.11.2015, 13:14   #2
[CODER]
Форумчанин
 
Аватар для [CODER]
 
Регистрация: 02.02.2010
Сообщений: 305
По умолчанию

Как вариант, для решения этой задачи можно сделать так:

Код:

class ChildrenThread extends Thread {

    public volatile boolean play = true;

    @Override
    public void run() {
        int i = 0;
        while (!isInterrupted()) {
            checkPause();
            System.out.println(i++);
        }
    }

    public synchronized void play() {
        play = true;
        notify();
    }

    public void pause() {
        play = false;
    }

    private synchronized void checkPause() {
        while (!play) {
            try {
                wait();
            } catch (InterruptedException ex) {
                interrupt();
                play = true;
            }
        }
    }
}
Хоть это и не совсем то, что я хотел, но пока так.


Мне не понятно, почему нельзя приостановить выполнение потока используя подход из первого поста. Это какое-то ограничение в java на случай если wait() будет вызван в процессе выполнения какой-то "важной" операции, не завершение которой может привести к потере данных?
Skype: CODERua

Последний раз редактировалось [CODER]; 27.11.2015 в 11:38.
[CODER] вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приостановка потока с последующем возобновлением работы Dozent Общие вопросы Delphi 9 21.04.2015 18:34
Приостановка выполнения цикла ACE Valery Общие вопросы C/C++ 21 19.11.2011 12:40
Приостановка потока bulldog5293 Работа с сетью в Delphi 19 19.11.2010 18:37
Приостановка\продолжение потока bulldog5293 Общие вопросы Delphi 6 20.09.2010 21:47
приостановка выполнения процедуры BESS Общие вопросы Delphi 5 15.09.2008 00:53