Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 1
Регистрация: 12.06.2017
Сообщений: 36

Как остановить потоки?

24.06.2017, 18:32. Показов 2856. Ответов 1

Студворк — интернет-сервис помощи студентам
Хочу сделать такую задачу. Создать 36 потоков. Остановить каждый (wait() ). и затем по команде notifyAll(), одновремено разбудить все и тот кто первый замониторит метод должен будет написать "Первым взял поток №n", где n - имя потока.
вот что получилось:

[
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
code]import java.util.Objects;
 
class Roulette implements Runnable{
    public Integer count = 0;
    @Override
    public void run() {
        Object args = null;
        
        synchronized.wait();
            
        
        
        synchronized (count) {
            if (count < 1){
                System.out.printf("Первым взял %s \n",Thread.currentThread().getName());
                count++;
            }
            
        }
        
    }
    
    
    
}
 
 
public class Casino {
    public static void main (String[] args) throws InterruptedException{
        
        for (int i=1; i<37; i++){
            Thread potok = new Thread(new Roulette());
            potok.setName("Поток: " + i);
            potok.start();
            synchronized (potok) {
                potok.wait();   
            }
            
        }
        synchronized (args) {
            Roulette.class.notifyAll(); 
        }
        
        
        
    }
 
}[/code]
ругается на synchronized.wait();, объясните каким образом и куда его нужно поставить, что бы вначале потоки были созданы и остановлены, пока главный поток не скажет notifyAll();

Добавлено через 1 час 32 минуты
Попробовал что-то таким образом:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import java.util.Objects;
 
class Roulette implements Runnable{
    public Integer count = 0;
    @Override
    public void run() {
        Object args = null;
        
        synchronized(count){
            try {
                count.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
            
        
        
        synchronized (count) {
            if (count < 1){
                System.out.printf("Первым взял %s \n",Thread.currentThread().getName());
                count++;
            }
            
        }
        
    }
    
    
    
}
 
 
public class Casino {
    public static void main (String[] args) throws InterruptedException{
        
        for (int i=1; i<37; i++){
            Thread potok = new Thread(new Roulette());
            potok.setName("Поток: " + i);
            potok.start();
            /*synchronized (potok) {
                potok.wait();   
            }*/
            
        }
        
        someMethod();
        /*synchronized (args) {
            Roulette.class.notifyAll(); 
        }*/
        
        
        
    }
    public static void someMethod(){
        synchronized(Roulette.class){
            Roulette.class.notifyAll();
        }
    }
 
}
теперь ошибок при компиляции не выдает, и когда дебажишь вроде и notifyAll() запускается. Но программа не останавливается. Результат не печатается.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.06.2017, 18:32
Ответы с готовыми решениями:

Как по нажатию кнопки остановить все потоки?
Есть программа которая считает файлы в указанной директории public class CountFilesTest { public static void main(String args)...

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

Остановить все потоки через определённое время
Создаю и запускаю несколько потоков в петле. Как сделать что бы все сразу остановились через определённое время? public void...

1
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
25.06.2017, 00:58
Важно то, у какого из объекта вы вызываете synchronized/wait()/notifyAll().
В вашем коде вы всегда используете разные объекты, и из-за этого ничего не работает.
Вам нужно в самом начале программы создать один объект, который вы будете использовать для синхронизации во всех потоках.

Добавлено через 26 секунд
Советую ознакомиться:
https://www.cyberforum.ru/blog... g2234.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.06.2017, 00:58
Помогаю со студенческими работами здесь

Потоки: при остановке одного - остановить следующие
Всем доброго времени суток. Имееются N потоков одного класса (отрисовывающихся) которые движутся с заранее заданным промежутком. как можно...

Как остановить потоки
for (int i = 0; i &lt; StrToInt(Form1-&gt;sSpinEdit1-&gt;Text); i++) {//в Edit1 количество потоков _beginthreadex( NULL, 0, &amp;nobonob,(void *)0,...

Как остановить потоки в потоке?
У меня есть программа следующего вида: class Program { private static void Main() { Thread...

Как остановить все потоки разом?
вот код программы после запуска с помощью левой кнопки мыши я создаю потоки(шарики) и с помощью правой кнопки мыши надо остановить все...

Boost thread pool. Как остановить потоки?
Привет. Реализовал thread pool с помощью boost::thread_group и boost::asio::io_service for (unsigned int i = 0; i &lt;...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru