Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/51: Рейтинг темы: голосов - 51, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 14.02.2009
Сообщений: 470

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

17.11.2006, 15:38. Показов 9860. Ответов 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru