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

Последовательный запуск Thread процессов с использованием ExecutorService

28.07.2014, 16:03. Показов 3713. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Я здесь впервые, поэтому не знаю еще как принято излагать вопросы. Так что заранее извиняюсь.

Появилась у меня задача последовательно запускать Thread процессы. При этом основная программа не должна ждать выполнения чего-либо: отдала команду запустить, скажем 2 процесса и продолжает работу, а процессы уже сами должны выполняться один за другим.

Поскольку на Java в последние годы пишу спорадически, пришлось поискать в сети решение поэлегантнее и попытаться скопипастить. Одно из этих предложений мне понравилось и написал я такой код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestThreads {
    public static void main(String[] args) {
        
        ExecutorService pool = Executors.newFixedThreadPool(2);
        try {
         
         System.out.println("-0-");
         pool.submit(new TestCallable("C1")).get();
            System.out.println("-1-");
         pool.submit(new TestCallable("C2")).get();
            System.out.println("-2-");            
            
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}
В качестве процессов вызываются объекты такого класса:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.concurrent.Callable;
 
public class TestCallable implements Callable<Boolean> {
    
    private String str;
    
    public TestCallable(String str){
        this.str = str;
    }
    
    @Override
    public Boolean call() throws Exception {
        System.out.println(str + " START");
        Thread.sleep(2000);
        System.out.println(str + " STOP");
        return true;
    }
}
В результате все работает последовательно, но основной процесс main ждет окончания выполнения Thread-ов. Т.е. никакой параллелизации не получается и результат работы программы

-0-
C1 START
C1 STOP
-1-
C2 START
C2 STOP
-2-
  • Вопрос 1: Что я не так делаю, что не параллелизирует выполнение?
  • Вопрос 2: Результат не зависит от того какое число я ставлю аргументом: Executors.newFixedThreadPool(1) или Executors.newFixedThreadPool(2). Мне казалось, что этот аргумент должен влиять именно на ход основной программы. В чем я запутался?


Спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.07.2014, 16:03
Ответы с готовыми решениями:

Запуск программ по определенной схеме с использованием Fiber и Thread
Необходимо выполнить запуск программ калькулятора (сalc.exe), Графического редактора Paint (mspaint.exe), блокнота (notepad.exe) по такой...

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

Последовательный запуск батников
Смысл всего: sql+ утилитой подключаясь к системе выгружаю через вьюху данные из БД в .csv файл далее подключаюсь к другой БД (mysql) и...

2
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
28.07.2014, 16:08
-Y-, Во-первых: Пожалуйста не выдумавайте новых терминов и называйте вещи своими именами. Термины "Поток", "Процесс" и "Thread" имеют вполне конкретное общепринятое значение. И ваша фраза запускать Thread процессы всё только запутывает.

По поводу вашего кода:
1. Не нужно в основном потоке вызывать get после вызова submit. Как раз вызов get() и блокирует основной поток.
2. Чтобы ваши таски, отправленные в пул, выполнялись по очереди - нужно использовать Executors.newFixedThreadPool(1)
1
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
28.07.2014, 16:19  [ТС]
turbanoff, большое спасибо. С Вашей помощью проблема решена. Копипаст был нерабочий. Теперь все работает хорошо и логично.

Я, конечно же, должен извиниться за мешанину с терминологией. Дело в том, что на Java регулярно писать перестал лет 5 назад и с тех пор много чего забыл. Изредка-спорадически приходится возвращаться. Если Вы скажете где можно взглянуть разницу между "Поток", "Процесс" и "Thread" с удовольствием обновлю знания, но вот серьезно читать книги и пере-изучать Java, к сожалению, возможности (да и смысла) нет - работаю в совсем другой области.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.07.2014, 16:19
Помогаю со студенческими работами здесь

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

Последовательный запуск таймеров
Здравствуйте. У меня есть 5 таймеров. Как сделать так, чтобы сначала запустился 1-й таймер, затем через 3 секунды запустился 2-й (при этом...

Последовательный запуск макросов
Привет всем. Не много поясню картину: На данный момент у меня 3 компа, на них сразу открываю по 3-4 файла(книги), и запускаю на каждой...

Последовательный запуск *.exe
Ребят а можно ли сделать так, чтобы проги запускались друг за другом, но только после выполнения (закрытия) предыдущей? Просто каждый раз...

Последовательный запуск через батник
в общем суть вопроса такова: нужно в батнике прописать запуск exe-шников последовательно,но не переключением их через энтер...тоесть 1...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью 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 и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru