Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для Alradalion
132 / 126 / 85
Регистрация: 13.09.2013
Сообщений: 485

Пулл потоков, завершение программы

23.10.2016, 13:50. Показов 660. Ответов 1
Метки нет (Все метки)

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

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
public class WorkQueue {
    private final int nThreads;
    private final PoolWorker[] threads;
    private final LinkedList queue;
 
 
    public WorkQueue(int nThreads)
    {
        this.nThreads = nThreads;
        queue = new LinkedList();
        threads = new PoolWorker[nThreads];
  }
 
 
    public void start() {
        for (int i=0; i<nThreads; i++) {
            threads[i] = new PoolWorker();
            threads[i].start();
        }
    }
 
    public void execute(Runnable r) {
        synchronized(queue) {
            queue.addLast(r);
            queue.notify();
        }
 
    }
 
    private class PoolWorker extends Thread {
        public void run() {
            Runnable r;
 
            while (true) {
 
                synchronized(queue) {
                    System.out.println(queue.size());
                    while (queue.isEmpty()) {
                        try
                        {
                            queue.wait();
                        }
                        catch (InterruptedException ignored)
                        {
 
                        }
                    }
 
                    r = (Runnable) queue.removeFirst();
                }
 
 
                try {
                    r.run();
                }
                catch (RuntimeException e) {
                    throw new RuntimeException("Exception for method run()", e);
                }
            }
        }
    }
}
Main
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {
 
 
        public static void main(String[] args) throws InterruptedException {
            WorkQueue pool = new WorkQueue(2);
            pool.start();
 
            for (int i = 1; i < 10; i++) {
                final int finalI = i;
                pool.execute(new Factorial(finalI));
               
            }
 
 
            Thread.sleep(5_000);
            System.out.println("Done");
 
        }
 
}
Класс факториала:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Factorial implements Runnable {
    private final int fact;
 
    public Factorial(int fact) {
        this.fact = fact;
    }
 
    @Override
    public void run() {
        int result = 1;
        for (int j = 1; j < fact + 1; j++) {
            result += result * j;
            try {
                Thread.sleep(500);
            } catch (InterruptedException ignore) {
            }
        }
        System.out.println(Thread.currentThread()+" Result " + fact + " = " + result);
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.10.2016, 13:50
Ответы с готовыми решениями:

Запуск кодов в потоках и завершение потоков
Построить класс Letters, которая будет использоваться для запуска кодов, выписывая каждую секунду буквы, приведенные в надписи,...

Завершение работы программы
Доброго времени суток, подскажите пожалуйста как завершить работу программы при пойманном исключении?

Группа потоков: как отследить завершение последнего?
В общем, прошу хелпа, ибо зело замудохался :( Дано: группа потоков, нужно в главном дождаться, когда сработает последний из этих...

1
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
23.10.2016, 20:16
Надо сделать так, чтобы ваши потоки завершились. То есть вышли из бесконечного цикла.
Проще всего - добавить в очередь какой-нибудь маркер (например null). И в цикле проверять, если встретился null, то из цикла можно выходить.
null-ов соответственно нужно запихать столько, сколько у вас потоков.

PS. Такая техника называется Poisoin pill
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.10.2016, 20:16
Помогаю со студенческими работами здесь

БД. Завершение программы
Хочу попробовать для хранения данных программы-бота SQLite. Опыт работы с этой БД уже есть, однако меня очень сильно беспокоит одна...

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

Завершение программы (уничтожение потоков)
При нажатии на кнопке &quot;старт&quot; у меня создается пол потоков, и кнопка меняет своё название на &quot;стоп&quot;. Как остановить выполнение...

Создание и завершение процессов и потоков. Приоритеты выполнения потоков
Здравствуйте. Буду очень раз если поможете понять,что конкретно нужно сделать в вот этом задании,пока особого представления о...

Завершение потоков
for (int i = 0; i &lt; 15; i++) { LThread *l = new LThread(); threads.push_back(l); l-&gt;start(); } ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
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 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru