0 / 0 / 1
Регистрация: 14.02.2009
Сообщений: 470

Ожидание основной программы

17.11.2006, 15:38. Показов 9925. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Основная программа запускает в цикле несколько потоков. Затем ей надо подождать, пока они все отработают. Как это лучше организовать?

(продолжать выполнение можно, когда статическая переменная pcount==0)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.11.2006, 15:38
Ответы с готовыми решениями:

Основной цикл, для работы программы
Вообщем, дело вот в чем решил написать простенькую текстовую игру. Но так как с архитектурой я почему никак не могу подружиться, не...

Вызов подпрограммы из основной программы, с сохранением работоспособности основной программы?(подробно внутри)
Добрый день. Буду благодарен, если кто-нибудь подскажет как такое реализовать. Суть вопроса: В основном консольном приложении...

Выполнение другой программы по завершению основной программы
Доброго времени суток форумчане. Делаю алгоритм для обновления программы. скачиваю обновления с FTP сервера в папку. Подскажите пожалуйста,...

42
sergioK
23.11.2006, 17:22
Студворк — интернет-сервис помощи студентам
маленькая поправочка в коде
Danissimo (21.11.2006)
boombastik, +1. О4. инетерсный =)

vlav, вот так НИКОГДА не делай:

while(pcount>0) {Thread.sleep(50);}

Если CPU лишний, лучше мне отдай. И main это и есть пототк в чистом виде, а не "своего рода" (boombastik, это я к твоим словам придираюсь).

А делать вот так:

class ThreadController {
private int running;

synchronized void start(ControlableThread t) {
t.start();
running += 1;
}

synchronized void onStop() {
if (running <= 0)
return;
if ((running -= 1) == 0)
notify(); <STRONG><FONT style="BACKGROUND-COLOR: #dd5555 // может правильнее notifyAll()
</STRONG>}

public static void main(String [] args) throws Exception {
ThreadController c = new ThreadController();
for (int i = 0; i < N; i++)
c.start(new ControlableThread(c));

synchronized (c) {
while (c.running > 0)
c.wait();
}
}
}

class ControlableThread extends Thread {
private final ThreadController c;
ControlableThread(ThreadController c) {
if (c == null)
throw new NullPointerException("c=null");
this.c = c;
}
public void run() {
try {
<STRONG><FONT style="BACKGROUND-COLOR: #55bbbb super.run()</STRONG> // без этого может не работать

// Your code
} finally {
c.onStop();
}
}
}

Уловил?
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
23.11.2006, 21:11
<STRONG>sergioK</STRONG>
<STRONG>Вы бы прокомментировали что ли свои добавления - notify() vs notifyAll(), super.run()</STRONG>
0
sergioK
24.11.2006, 14:17
потратил пол часа на ответ попытался отправить ,
получил еrror в котором сказано смотреть лог ,
И это не первый раз , может какая проблема из за того что я не в России, интересно что это случается исключительно на "русских" форумах
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
24.11.2006, 14:23
печально надо было кнопку "назад" в браузере попробовать

такие вещи бывает случаются, и не только на relib-е, меня это тоже всегда напрягает
0
sergioK
24.11.2006, 16:58
Поскольку мы используем наследника от thread и за работу отвечает run то поэтому и нужен super.run у меня была ситуация где по другому не работает ,
про <STRONG>notify()</STRONG> из опыта похожего на Явы языка в описанной ситуации <STRONG>notifyAll()</STRONG> надежнее
всех недовольных прошу высказаться здесь
mselez (23.11.2006)
<STRONG>sergioK</STRONG>
<STRONG>Вы бы прокомментировали что ли свои добавления - notify() vs notifyAll(), super.run()</STRONG>
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
24.11.2006, 18:56
Поскольку мы используем наследника от thread и за работу отвечает run то поэтому и нужен super.run у меня была ситуация где по другому не работает ,
Это непонятно. Я никогда не делал super.run().
про notify() из опыта похожего на Явы языка в описанной ситуации notifyAll() надежнее
Я тоже что-то слышал про это, поэтому и попросил прокомментировать. Если notify() не всегда срабатывает, то его следовало бы изьять из обращения. Однако этого не происходит. Или вы про то, что неизвестно сколько там потоков ждет, поэтому лучше все разбудить?
Единственное, что мне известно наверняка, так это необходимость использования wait() только в цикле, где проверяется некоторый флаг. В приведенном выше коде так и сделано. Это обусловлено тем , что поток может пробудиться сам, без notify() (так называемый "spurious wakeup" ).
0
sergioK
24.11.2006, 21:58
кажется Я перепупал, если перегружать <STRONG>start</STRONG> то необходимо super.start() потому что имеено из него вызывается run, а super.run "пустой" точнее абстрактный его вызов ничего не даст ,
notifyAll() Я думаю правильней поскольку он освобождает все потоки согласно приоретету т,е, вроде бы есть возможность контролировать порядок ,
хотелось бы посмотреть код этих методов но они к cожалению Native
0 / 0 / 2
Регистрация: 30.06.2011
Сообщений: 173
29.11.2006, 15:43
вопрос немного в сторону:
Когда на каком нить Thread-е вызываем метод join(), то там в итоге вызывается метод wait()
Когда поток отрабатает, то ожидание от метода wait прекратиться. Насколько я смотрел класс Thread, - методы notify и notifyall при завершении потока не вызываются.
Я сделал вывод что метод notify или notifyall вызывается внутри нативного метода start().
Хотел узнать кто что по этому поводу думает?!
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
29.11.2006, 16:18
ННП.



2sergioK:

super.run() -- не надо. Он действительно пустой (но не абстрактный!!!).

Контролировать порядок пробуждения нет никакой возможности. Даже с notifyAll() =))



2mselez:

notify() вызывается только однажды (это про sleep()) -- когда обратный счетчик потоков обнулится.

Используется notify(), а не notifyAll() потому, что известно, что ожидает единственный поток.



2Alexadr:

notifyAll() вызывается, когда поток умирает =) Я хочу сказать, что notifyAll() точно вызывается. Могу рассказать, как это легко проверить =)) Если интересно...



2bombastik & 2mselez:

Java потоки мапятся на нативные потоки. => wait() и notify(), а также sleep() -- обращение к ОС, то есть системный вызов. И системные же очереди. Именно это я и подразумевал, когда рассуждал о sleep() vs. wait()/notify().
0
0 / 0 / 2
Регистрация: 30.06.2011
Сообщений: 173
29.11.2006, 19:00
Danissimo (29.11.2006)
ННП.
2Alexadr:
notifyAll() вызывается, когда поток умирает =) Я хочу сказать, что notifyAll() точно вызывается. Могу рассказать, как это легко проверить =)) Если интересно...
Ну и как это проверить?
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
29.11.2006, 19:12
О4. просто =))
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Thread t = new Thread() {
    public void run() {
        try {
            sleep(1000);
        } catch (InterruptedException ignore) {}
        System.out.println("FINISHED");
    }
};
t.start();
System.out.println("WATING");
synchronized(t) {
    while (t.isAlive())
        t.wait();
}
System.out.println("NOTIFIED");
NOTIFIED будет напечатано ВСЕГДА после FINISHED.
0
Ghost
29.11.2006, 20:17
Уфффф... старый я стал )
В свое время, когда писал на C++ под Windows, помню, там были шикарные функции WaitForSingleObject / WaitForMultiplyObjects. Их аналогов под Java, часом, нету?
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
29.11.2006, 20:47
notifyAll() вызывается, когда поток умирает =)
и если кому что должен, то всем "прощает" ))
0
paradise
29.11.2006, 22:23
NOTIFIED будет напечатано ВСЕГДА после FINISHED.
Давай ссылку на спеку. Иначе это хак, на который нельзя полагаться.
mishgun
30.11.2006, 00:43
Ghost (29.11.2006)
Уфффф... старый я стал )



В свое время, когда писал на C++ под Windows, помню, там были шикарные функции WaitForSingleObject / WaitForMultiplyObjects. Их аналогов под Java, часом, нету?


Da prosto narod upersya v wait ()i notify() i dalshe dumat ne hochet.

A ved sushestvuet ThreadGroup ili thread.yield() kotorie bolshe podhodyat k tomu chto napeysal afftar v samom pervom poste.

Dano Main Thread kotoriy zapuskaet ostalnie threads i zhdet poka oni zakonchat rabotat.

Solutions:

1.ThreadGroup

2. thread.yeild()

3.wait()- notify()
0 / 0 / 2
Регистрация: 30.06.2011
Сообщений: 173
30.11.2006, 15:08
Давай ссылку на спеку. Иначе это хак, на который нельзя полагаться.
В том то и дело что в спецификациях я на эту тему ничего не нашел!!!
Однако если даже не верить примеру который привел Danissimo(хотя все там работает правильно), то можно посмотреть и проанализировать работу метода join().
Похоже что где-то в конце кода нативного метода start() происходит вызов нативного метода notifyAll(), - ессно нам это не видно...
0
paradise
30.11.2006, 17:05
Alexadr (30.11.2006)

Однако если даже не верить примеру который привел Danissimo(хотя все там работает правильно), то можно посмотреть и проанализировать работу метода join().

Похоже что где-то в конце кода нативного метода start() происходит вызов нативного метода notifyAll(), - ессно нам это не видно...


При чем тут метод start()? Он неблокирующий. Ты его вызвал, поток запустился и работает два дня. По твоему, notifyAll() будет вызвано сразу после вызова start()? Или через два дня?



Это похоже на hack со стороны реализации. Я бы не стал на это закладываться. Логика работы join() может измениться и notifyAll() перестанет вызываться. Код не будет работать.
paradise
30.11.2006, 17:14
Danissimo (29.11.2006)

super.run() -- не надо. Он действительно пустой (но не абстрактный!!!).

Контролировать порядок пробуждения нет никакой возможности. Даже с notifyAll() =))
Поддерживаю.



Danissimo (29.11.2006)

2bombastik & 2mselez:

Java потоки мапятся на нативные потоки. => wait() и notify(), а также sleep() -- обращение к ОС, то есть системный вызов. И системные же очереди. Именно это я и подразумевал, когда рассуждал о sleep() vs. wait()/notify().


Закладываетесь на реализацию. В линуксе потоки JVM могут мэпиться на pthreads например. Все это зависит от реализации.



Если что-то используешь, надо понимать, как это работает. Для меня главное отличие sleep() от wait() - работа с замками.



В ситуации, описанной автором вопроса join лучше всего подходит.
0 / 0 / 2
Регистрация: 30.06.2011
Сообщений: 173
30.11.2006, 20:18
2 paradise
Согласен с тем, что в по теме автору лучше всего юзать метод join() (даже если несколько потоков)
А по поводу изменения логики работы метода join(), - думаю что она меняться не будет, а вот этот hack, когда дергается notifyAll() после того как отработает метод run(), может и будет заспецифицирован.
0
paradise
30.11.2006, 21:42
А может и не будет.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.11.2006, 21:42
Помогаю со студенческими работами здесь

Не работает тело основной программы
Добрый дань! Подскажите, пожалуйста, осваиваю AVR, написал небольшой код: отображение чисел на 4 разрядном семисегментном индикаторе. Так...

Задержка выполнения основной программы
text segment assume cs:text, ds:data ;цикл из 10 шагов, которые будут выполнятся с задержкой порядка нескольких секунд begin: mov...

Взаимодействие потока и основной программы
- Здравствуйте многоуважаемые! Наверняка кто-то хорошо разбирается в вещах, в которых я сейчас заплутал. В моем приложении в основной...

Lua + C++ - основной цикл программы
Доброго дня, уважаемые. Помогите пожалуйста)) а то чувствую себя как Волк из Ну погоди, из какой то серии, где в отражении была ослиная...

Обращение к настройкам из основной программы
Всем привет! Столкнулся с проблемой! Сделал тестовое приложение состоящее из основной программы и библиотеки. В основной программе завёл...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru