Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137

FixedThreadPool

13.01.2017, 19:05. Показов 2405. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Java
1
2
3
4
5
6
       
 ExecutorService es = Executors.newFixedThreadPool(2);
 es.execute(new MyThread(cdl, "A"));
 es.execute(new MyThread(cdl, "B"));
 es.execute(new MyThread(cdl, "C"));
 es.execute(new MyThread(cdl, "D"));
в книге Шилдта сказано, что "в пуле содержится два потока исполнения. Только две задачи могут быть выполнены одновременно, а остальные должны ожидать до тех пор, пока в пуле не освободится один из потоков исполнения, чтобы им можно было воспользоваться".
Почему Шилдт говорит, что в пуле содержится два потока? Разве это не мы эти потоки в пул передаем? А изначально только указываем количество мест для потоков в пуле = 2. Сама фраза "что пул содержит", "пока в пуле не освободится поток" мне кажется странной - ведь это мы в пул кладем потоки, а экзекьютор их просто исполняет, и одновременно в данном случае он может исполнять только 2 потока одновременно. Может быть, правильнее было сказать, "пока пул не осободится" а не "пока поток не освободится в пуле"? Ведь поток в пуле отработал и ушел, а освободилось именно место для него. Или я что-то не знаю или не правильно понимаю? Спасибо
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.01.2017, 19:05
Ответы с готовыми решениями:

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

Многопоточное умножение матрицы FixedThreadPool
Есть задача умножить две матрицы в могопоточном режиме используя FixedThreadPool. Я создал класс AllTask в котором есть очередь(тут сразу...


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

Или воспользуйтесь поиском по форуму:
15
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
13.01.2017, 19:31
Лучший ответ Сообщение было отмечено KEKCoGEN как решение

Решение

http://tutorials.jenkov.com/ja... pools.html
1
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
13.01.2017, 20:08
Цитата Сообщение от danek130995 Посмотреть сообщение
ведь это мы в пул кладем потоки
Мы кладём в пул задачи (Callable и Runnable) для потоков. А сами потоки (Thread) создаёт пул.
То что вы ваши задачи обозвали MyThread - не означает, что их будет использовать executor.
Возможно вас смутило то, что сласс Thread реализует Runnable.
2
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
13.01.2017, 20:45
Цитата Сообщение от danek130995 Посмотреть сообщение
А изначально только указываем количество мест для потоков в пуле
И что такое «место для потоков в пуле»?

Добавлено через 2 минуты
Цитата Сообщение от danek130995 Посмотреть сообщение
экзекьютор их просто исполняет, и одновременно в данном случае он может исполнять только 2 потока одновременно.
Потоки исполняет JVM.
1
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
13.01.2017, 22:50  [ТС]
turbanoff, да, Вы правы, спасибо, меня смутило что MyThread реализует Runnable и еще называется так - MyThread, я случайно подумал, что мы поток создаем. Мы создаем задачу (Runnable), которая, возможно, потом будет в executor'е послана на вход конструктору класса Thread чтобы создать поток

Добавлено через 3 минуты
turbanoff, еще я заметил, что executor "прыгает" между потоками, т.е. несмотря на то, что на вход newFixedThreadPool() послано 2, при исполнении четырех потоков вывод в консоль перемешивается. Я думал, что он сначала возьмет две задачи, исполнит их полностью(параллельно), а потом перейдет к следующим двум посланным задачам. Но нет, вывод в консоль из 4 задач перемешивается. Получается, executor постоянно подменяет Runnable у потоков? Это разве возможно?

Вот пример кода:
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
public class SimpExec {
    public static void main(String args[]){
        CountDownLatch cdl = new CountDownLatch(5);
        CountDownLatch cdl2 = new CountDownLatch(5);
        CountDownLatch cdl3= new CountDownLatch(5);
        CountDownLatch cdl4 = new CountDownLatch(5);
        ExecutorService es = Executors.newFixedThreadPool(2);
 
        System.out.println("Запуск потоков");
 
        es.execute(new MyThread(cdl, "A"));
        es.execute(new MyThread(cdl, "B"));
        es.execute(new MyThread(cdl, "C"));
        es.execute(new MyThread(cdl, "D"));
 
        try {
            cdl.await();
            cdl2.await();
            cdl3.await();
            cdl4.await();
        } catch (InterruptedException exc){
            System.out.println(exc);
        }
 
        es.shutdown();
        System.out.println("Завершение потоков");
    }
    static class MyThread implements Runnable {
        String name;
        CountDownLatch latch;
 
        MyThread(CountDownLatch c, String n) {
            latch = c;
            name = n;
 
            new Thread(this);
        }
 
        public void run() {
 
            for (int i = 0; i < 5; i++) {
                System.out.println(name + " : " + i);
                latch.countDown();
            }
        }
    }
}
и вывод:
Запуск потоков
A : 0
B : 0
A : 1
A : 2
A : 3
A : 4
B : 1
B : 2
C : 0
C : 1
C : 2
C : 3
C : 4
D : 0
B : 3
B : 4
D : 1
D : 2
D : 3
D : 4
казалось бы, сначала должны полностью завершится A и B, так как они начали первые исполнятся, но нет, мы видим, что в конце вывода опять появляется B. Значит он подменял задачи у потоков, так как задач 4, а потоков всего 2?
0
 Аватар для Gr1f0nn
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
13.01.2017, 23:20
Цитата Сообщение от danek130995 Посмотреть сообщение
Получается, executor постоянно подменяет Runnable у потоков?
Нет. Конкретная задача полностью завершается и только после этого запускается следующая. Потоку нельзя поменять задачу, как и перезапустить уже завершенный поток с новой задачей. Просто в вашем случае сначала завершился поток "А", после него начался поток "С", а после него поток "D". Потоку "В" немного не повезло
1
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
13.01.2017, 23:31  [ТС]
Gr1f0nn, спасибо, с тем примером понял, но сейчас другой вопрос: а задачи точно исполняются в том порядке, в котором передали executor'у? Почему у меня сейчас был вывод:
Запуск потоков
A : 0
A : 1
A : 2
A : 3
A : 4
C : 0
C : 1
C : 2
C : 3
C : 4
D : 0
D : 1
D : 2
D : 3
D : 4
B : 0
B : 1
B : 2
B : 3
B : 4
Т.е. A и C начали первыми исполнятся? Но ведь по коду сначала передаются A и B:
Java
1
2
3
4
 es.execute(new MyThread(cdl, "A"));
 es.execute(new MyThread(cdl, "B"));
 es.execute(new MyThread(cdl, "C"));
 es.execute(new MyThread(cdl, "D"));
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
14.01.2017, 00:40
какая тебе разница в каком порядке он будет выполнять твои потоки? если ты запускаешь несколько потоков, ты предполагаешь что они будут выполняться параллельно, т.е. в любом порядке.
0
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
14.01.2017, 01:25  [ТС]
xoraxax, ну просто я думал что он будет выполнять задачи в том порядке, в котором они ему были посланы. Например, послали ему 10 задач. А потоков всего 3. Он возьмет первые 3, потом еще 3, потом еще 3. И именно каждую тройку будет выполнять параллельно. А получается, он сам выбирает, какие задачи выполнять первыми?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
14.01.2017, 13:00
danek130995, Там внутри есть очередь. Настоящая, честная: которая добавляет к себе элементы в том порядке в котором вы их отправите.
В thread pool есть пачка потоков, которые в бесконечном цикле достают задачи из очереди и начинают выполнять.
То есть достанут из очереди - они в гарантированном порядке. Но не факт, что исполнение произойдёт мгновенно и в правильном порядке.
В вашем примере произошло примерно следующее:

Code
1
2
3
4
5
6
1-й поток из пула взял задачу A
2-й поток из пула взял задачу B
1-й поток закончил выполнять A, взял задачу C
1-й поток закончил выполнять C, взял задачу D
1-й поток закончил выполнять D
2-й поток закончил выполнять B
Если внимательно прочитать, то станет понятно, что задачи доставались в чётком порядке очереди.
1
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
14.01.2017, 15:17  [ТС]
turbanoff, в последней строчке Вы, наверное, имели в виду B?
А чем занимался 2-й поток, пока 1-ый выполнял задачу A?
2-й поток взял задачу B, и остановился покурить до тех пор, пока 1-й полностью не завершит задачу A и не возьмется за C, а потом за D?) Получается, 2-й поток бездействовал пока 1-й все это выполнял? Они же должны параллельно работать
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
14.01.2017, 17:23
Цитата Сообщение от danek130995 Посмотреть сообщение
А чем занимался 2-й поток, пока 1-ый выполнял задачу A?
На этот вопрос поможет ответить профайлер.
Цитата Сообщение от danek130995 Посмотреть сообщение
Они же должны параллельно работать
Слишком малый объём работы вы им дали, на таком сложно заметить параллельность. Накладные расходы на старт/получение задачи, занимают больше чем сама задача.
1
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
14.01.2017, 23:13  [ТС]
turbanoff, что такое профайлер?

Добавлено через 5 часов 27 минут
turbanoff, загуглил,
Профайлер – эксперт по выявлению лжи. Такой специалист может оценить и спрогнозировать поведение человека, анализируя его действия, мимику, жесты и то, как он говорит.
Как это понять в контексте нашей темы? Или это шутка ?) Тогда я не понял ее..
Цитата Сообщение от turbanoff Посмотреть сообщение
Накладные расходы на старт/получение задачи, занимают больше чем сама задача.
Вы имеете ввиду, что пока второй поток тратил время на старт/получение задачи B, в это время первый поток успел отработать сразу несколько задач?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
14.01.2017, 23:25
у меня рак от твоих вопросов
2
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
15.01.2017, 11:59  [ТС]
xoraxax, ну а может быть то, что я написал выше?
Цитата Сообщение от danek130995 Посмотреть сообщение
пока второй поток тратил время на старт/получение задачи B, в это время первый поток успел отработать сразу несколько задач?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
15.01.2017, 18:02
может быть все, что угодно, но это не важно
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru