powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / увеличивается количество потоков
17 сообщений из 17, страница 1 из 1
увеличивается количество потоков
    #39716728
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здравствуйте!
собственно сабж, увеличивается количество потоков на 120, и изза этого через некоторое время работы комп зависает...
как правильно завершить потоки?

задача такая:
при запуске проекта:
а) запускается сервис Read
а.1. в свою очередь СервисРидер запускает ВотчерСервис и прослушивает указанную директорию (тут вроде все нормально и компьютер загружается)

б) и если в часах минуты кратные на 5 (-1) запускаем сервис Write
б.1. должен на указанную папку записать 120 файлов при этом по 24 файлов с задержкой 0,5сек и по окончанию 24 пауза на 10сек и дальше, а по окончанию всех 120 задержка на 5 минут

вот собственно листинг:

Код: 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.
public class TestThread {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        ReadService readService = new ReadService();
        readService.start();
        gt();

    }

    private static void gt() {
        Calendar cur = Calendar.getInstance();
        SimpleDateFormat sdfH = new SimpleDateFormat("HH");
        SimpleDateFormat sdfM = new SimpleDateFormat("mm");
        int h = Integer.parseInt(sdfH.format(cur.getTime()));
        int m = Integer.parseInt(sdfM.format(cur.getTime()));

        int interval = 5;
        if (m < 56) {
            int d = m % interval;
            cur.set(Calendar.HOUR_OF_DAY, h);
            cur.set(Calendar.MINUTE, m + interval - d - 1);
            cur.set(Calendar.SECOND, 0);
        } else {
            cur.set(Calendar.HOUR_OF_DAY, h + 1);
            cur.set(Calendar.MINUTE, 0);
            cur.set(Calendar.SECOND, 0);
        }

        Date startTime = cur.getTime();
        System.out.println(startTime);


        final ScheduledExecutorService scheduler
                = Executors.newScheduledThreadPool(1);

        scheduler.schedule(() -> {
            startingService();
        }, startTime.getTime() - new Date().getTime(), MILLISECONDS);
    }

    private static void startingService() {
        WriteService writeService = new WriteService();
        writeService.start();
    }

}



Райтер
Код: 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.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
class WriteService {

    private static final String OUT_PATH = "C:\\soob";

    private List<RequestDatas> list;

    public List<RequestDatas> getList() {
        return list;
    }

    public void setList(List<RequestDatas> list) {
        this.list = list;
    }

    void start() {
        System.out.println("WriteService " + new Date());
        setRequestDatas();
        writeToPath();
    }

    private List<Stations> getSt() {
        List<Stations> list = new ArrayList<>();
        list.add(new Stations(1, "q", "q"));
        list.add(new Stations(2, "w", "w"));
        list.add(new Stations(3, "e", "e"));
        list.add(new Stations(4, "r", "r"));
        list.add(new Stations(5, "t", "t"));
        return list;
    }

    private void setRequestDatas() {
        List<RequestDatas> l = new LinkedList<>();
        for (Stations s : getSt()) {
            l.add(new RequestDatas(s.getId() + "gr120", "(:212 0 " + s.getId() + " 29 0:5065 20 гр:)"));
            l.add(new RequestDatas(s.getId() + "gr140", "(:212 0 " + s.getId() + " 29 0:5065 40 гр:)"));
            l.add(new RequestDatas(s.getId() + "gr160", "(:212 0 " + s.getId() + " 29 0:5065 60 гр:)"));
            l.add(new RequestDatas(s.getId() + "gr170", "(:212 0 " + s.getId() + " 29 0:5065 70 гр:)"));
            l.add(new RequestDatas(s.getId() + "gr190", "(:212 0 " + s.getId() + " 29 0:5065 90 гр:)"));
            l.add(new RequestDatas(s.getId() + "gr1", "(:212 0 " + s.getId() + " 29 0:5065 0 гр:)"));
            l.add(new RequestDatas(s.getId() + "por120", "(:212 0 " + s.getId() + " 29 0:5065 20 пор:)"));
            l.add(new RequestDatas(s.getId() + "por140", "(:212 0 " + s.getId() + " 29 0:5065 40 пор:)"));
            l.add(new RequestDatas(s.getId() + "por160", "(:212 0 " + s.getId() + " 29 0:5065 60 пор:)"));
            l.add(new RequestDatas(s.getId() + "por170", "(:212 0 " + s.getId() + " 29 0:5065 70 пор:)"));
            l.add(new RequestDatas(s.getId() + "por190", "(:212 0 " + s.getId() + " 29 0:5065 90 пор:)"));
            l.add(new RequestDatas(s.getId() + "por1", "(:212 0 " + s.getId() + " 29 0:5065 0 пор:)"));
            l.add(new RequestDatas(s.getId() + "gr220", "(:212 0 " + s.getId() + ":5065 20 гр:)"));
            l.add(new RequestDatas(s.getId() + "gr240", "(:212 0 " + s.getId() + ":5065 40 гр:)"));
            l.add(new RequestDatas(s.getId() + "gr260", "(:212 0 " + s.getId() + ":5065 60 гр:)"));
            l.add(new RequestDatas(s.getId() + "gr270", "(:212 0 " + s.getId() + ":5065 70 гр:)"));
            l.add(new RequestDatas(s.getId() + "gr290", "(:212 0 " + s.getId() + ":5065 90 гр:)"));
            l.add(new RequestDatas(s.getId() + "gr2", "(:212 0 " + s.getId() + ":5065 0 гр:)"));
            l.add(new RequestDatas(s.getId() + "por220", "(:212 0 " + s.getId() + ":5065 20 пор:)"));
            l.add(new RequestDatas(s.getId() + "por240", "(:212 0 " + s.getId() + ":5065 40 пор:)"));
            l.add(new RequestDatas(s.getId() + "por260", "(:212 0 " + s.getId() + ":5065 60 пор:)"));
            l.add(new RequestDatas(s.getId() + "por270", "(:212 0 " + s.getId() + ":5065 70 пор:)"));
            l.add(new RequestDatas(s.getId() + "por290", "(:212 0 " + s.getId() + ":5065 90 пор:)"));
            l.add(new RequestDatas(s.getId() + "por2", "(:212 0 " + s.getId() + ":5065 0 пор:)"));
        }
        setList(l);
    }

    private void writeToPath() {
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                for (Stations s : getSt()) {
                    writeToPathService(s.getId() + "gr120", "(:212 0 " + s.getId() + " 29 0:5065 20 гр:)");
                    holdMess();
                    writeToPathService(s.getId() + "gr140", "(:212 0 " + s.getId() + " 29 0:5065 40 гр:)");
                    holdMess();
                    writeToPathService(s.getId() + "gr160", "(:212 0 " + s.getId() + " 29 0:5065 60 гр:)");
                    holdMess();
                    writeToPathService(s.getId() + "gr170", "(:212 0 " + s.getId() + " 29 0:5065 70 гр:)");
                    holdMess();
                    writeToPathService(s.getId() + "gr190", "(:212 0 " + s.getId() + " 29 0:5065 90 гр:)");
                    holdMess();
                    writeToPathService(s.getId() + "gr1", "(:212 0 " + s.getId() + " 29 0:5065 0 гр:)");
                    holdMess();
                    writeToPathService(s.getId() + "por120", "(:212 0 " + s.getId() + " 29 0:5065 20 пор:)");
                    holdMess();
                    writeToPathService(s.getId() + "por140", "(:212 0 " + s.getId() + " 29 0:5065 40 пор:)");
                    holdMess();
                    writeToPathService(s.getId() + "por160", "(:212 0 " + s.getId() + " 29 0:5065 60 пор:)");
                    holdMess();
                    writeToPathService(s.getId() + "por170", "(:212 0 " + s.getId() + " 29 0:5065 70 пор:)");
                    holdMess();
                    writeToPathService(s.getId() + "por190", "(:212 0 " + s.getId() + " 29 0:5065 90 пор:)");
                    holdMess();
                    writeToPathService(s.getId() + "por1", "(:212 0 " + s.getId() + " 29 0:5065 0 пор:)");
                    holdMess();
                    writeToPathService(s.getId() + "gr220", "(:212 0 " + s.getId() + ":5065 20 гр:)");
                    holdMess();
                    writeToPathService(s.getId() + "gr240", "(:212 0 " + s.getId() + ":5065 40 гр:)");
                    holdMess();
                    writeToPathService(s.getId() + "gr260", "(:212 0 " + s.getId() + ":5065 60 гр:)");
                    holdMess();
                    writeToPathService(s.getId() + "gr270", "(:212 0 " + s.getId() + ":5065 70 гр:)");
                    holdMess();
                    writeToPathService(s.getId() + "gr290", "(:212 0 " + s.getId() + ":5065 90 гр:)");
                    holdMess();
                    writeToPathService(s.getId() + "gr2", "(:212 0 " + s.getId() + ":5065 0 гр:)");
                    holdMess();
                    writeToPathService(s.getId() + "por220", "(:212 0 " + s.getId() + ":5065 20 пор:)");
                    holdMess();
                    writeToPathService(s.getId() + "por240", "(:212 0 " + s.getId() + ":5065 40 пор:)");
                    holdMess();
                    writeToPathService(s.getId() + "por260", "(:212 0 " + s.getId() + ":5065 60 пор:)");
                    holdMess();
                    writeToPathService(s.getId() + "por270", "(:212 0 " + s.getId() + ":5065 70 пор:)");
                    holdMess();
                    writeToPathService(s.getId() + "por290", "(:212 0 " + s.getId() + ":5065 90 пор:)");
                    holdMess();
                    writeToPathService(s.getId() + "por2", "(:212 0 " + s.getId() + ":5065 0 пор:)");
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException ie) {
                        Logger.getLogger(WriteService.class.getName()).log(Level.SEVERE, null, ie);
                    }
                }
            }
        }, 0, 5, TimeUnit.MINUTES);
    }

    private void holdMess() {
        try {
            Thread.sleep(500);
        } catch (InterruptedException ie) {
            Logger.getLogger(WriteService.class.getName()).log(Level.SEVERE, "hold Messages", ie);
        }
    }

    private void writeToPathService(final String spr, final String data) {
        ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
        ses.schedule(new Runnable() {
            @Override
            public void run() {

                initFile(spr, data);

            }
        }, 1, TimeUnit.SECONDS);
    }

    private void initFile(String spr, String data) {
        try (OutputStream outputStream = new FileOutputStream(OUT_PATH + "\\0106a0" + spr);
                Writer outputStreamWriter = new OutputStreamWriter(outputStream, "Cp866");) {
            outputStreamWriter.write(data);
            System.out.println("file is created >> " + data + " >>> created date " + new Date());
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(WriteService.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(WriteService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}



Ридер думаю нет необходимости :)

и в ВижуальВМ получил вот такую картину...
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39716835
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть предложения по оптимизации?
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39716841
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Больше экзекьюторов! И чем они singleThreaded тем лучше ))

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

С локальной точки зрения, чтобы уйти от +120 потоков каждые 5 минут, то надо либо не пересоздавать WriterService каждые 5 минут опять же, либо заменить

Код: java
1.
2.
3.
 private void writeToPath() {
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(new Runnable() {



на

Код: java
1.
2.
3.
 private void writeToPath() {
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        service.schedule(new Runnable() {
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39716843
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и не забывать делать экзекьюторам shutdown когда они отработали
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39716960
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сразу скажу что я твой код не смотрел детально.

Музаффарздравствуйте!
собственно сабж, увеличивается количество потоков на 120, и изза этого через некоторое время работы комп зависает...

120 здесь непричем. Бывало и стократно больше и приложение нормально работало. Вообще мне вспоминается
лекция Шипилева на тему перформанса где приводится пример утилизации ресурсов. Сжигается целый лес древесины
чтобы согреть чайник чая. Вобщем это приложение похоже сжигает лес. Убежден что задачу файловых операций
можно решить дешевле. Другое дело - какое задание ставил препод и ЧТО надо было продемонстрировать в приложении?
Какие технологии? Хотел препод чтоб просто файлы записались? Это вообще быстрее сработает в одном потоке
для вашего ноутбука. Хотел чтоб жгли лес? Ну ОК.

как правильно завершить потоки?

Только тот кто писал код - знает как корректно завершить. Корректно - это не kill -9 а просто поставить булевый
флажок в тело цикла и если флаг установлен то - выйти из главного цикла. Это мягкий и безопасный способ.

Остановить threadpool executor всегда можно. Но при этом остаётся за кадром вопрос - что будет с состоянием
потоков которые писали в файл и что будет в этом файле? Руины. Тоесть - это up to you. Вы сами должны знать точку
во времени где у вас все потоки завершены. Архитектурно - наверное лучше не потоки а Callable чтоб фиксировать
финиш последнего.

По поводу Thread.sleep. Я чето вспомнил что мы на проекте везде позаменяли его на LockSupport.parkNanos и parkUntil.
Сейчас не могу вспомнить зачем. Надо почитать и вспомнить.
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39716969
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде есть разница в утилизации потока между сред.слип и уиелд. А вообще дайкстра вроде ещё сказал что бездумно раскидывать на потоки алгоритм весьма неэффективно и если 2 потока работают быстрее чем 1 то 5 потоков не факт что быстрее чем 2. А 10 потоков уже могут и медленнее одного тянуть.
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39716972
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Дейкстра предложил что-то вместо потоков? В современном браузере например. Там - много задач которые
создают иллюзию параллельной работы. Как их кодить?
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39717005
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА Дейкстра предложил что-то вместо потоков? В современном браузере например. Там - много задач которые
создают иллюзию параллельной работы. Как их кодить?
это воркеры
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39717007
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это точно подогреть чайник - спалить пол леса.
тут имхо и статичного пула с 10 потоками хватит
отчего же приложение то валится?
может по памяти ? может memoryawarethreadpool что бы угомотить вакханалию
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39717008
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. По памяти у него 128 м выделено и всего хватает.

Там если по вкладкам поклацать будет диаграмма активности потоков. Я бы глянул сколько их и какого цвета полоска.
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39717025
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да что тут обсуждать, 5 минут хватило чтобы понять что он каждые 5 минут пересоздание writerservice, внутри которого он делает scheduleatfixedrate() таким образом каждые 5 минут число потоков прирастает на 120 и все они продолжают писать в одно место в файловой системе, конечно оно на io и синхронизации потоков и загибается
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39717034
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА Дейкстра предложил что-то вместо потоков? В современном браузере например. Там - много задач которые
создают иллюзию параллельной работы. Как их кодить?
я не совсем понял вопроса, ну думаю, в несколько потоков это ж очевидно )) просто в рамках разумного зачем фигачить 120+ потоков которые всё-равно делают ИО и там всё-равно всё синхронно? да даже без ИО.

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

и да... оно не работало. в смысле, оно не работало нормально, т.е. часть потоков просто стакало во всяких неожиданных местах, при том что взаимных блокировок не было. а агент показывал раннинг. вообще какая то дичь происходила, ну у меня просто компетенции не хватило разобраться.

решили просто, выкинули всё это ужасное дерево и оставили только то количество потоков которое было равно количеству ядер на хосте, остальные ждали своей очереди -- заработало.
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39717059
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот после шатдауна получаю такую картину... хотя надо все таки оптимизировать т.к. понял что там можно сделать чуть по другому, на работе сначала запущу как там будет вести себя измененный код потом посмотрим

кстати за подсказки спасибо!
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39717064
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTрешили просто, выкинули всё это ужасное дерево и оставили только то количество потоков которое было равно количеству ядер на хосте, остальные ждали своей очереди -- заработало.
Формула количество ядер==количество потоков справедлива только для процессов которые грузят CPU.
Яркий пример - бенчмарк с рисованием трехмерных шаров. Если у вас - больше waits, которые ожидают I/O
тогда количество потоков можно увеличивать. С другой стороны там тоже есть точка экстремума где
пропускная способность приложения сначала растет а потом снижается. Найти эту точку - большое
искусство. Но я еще раз подчеркну что это не всегда число тредов. Возьмите любое крупное java-приложение
и сделайте thread-dump к примеру. 90% потоков стоят в ожиданиях. И если вы для них сделаете 4-8 тредов
на пул то получите просто неэффективное приложение. Кстати еще поинт - создавать множество пулов
и группировать их по роду задач. DBMS - один пул. Rest - другой. Или если Rest делится по внешним
интерфейсам - то еще делить дальше.
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39717069
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
совершенно согласен. многопоточка это вообще очень много если если то если сё если там если тут. и адекватно спланировать и сбалансировать потоки это отдельная олимпиада. но в целом, в совсем сферическом вакууме прирост производительности от количества потоков далекооооо не линейный. я не говорю что надо на 8 потоков зарезать всё приложение и всё, но на играющих потоках я не вижу смысла иметь сильно больше количества виртуальных ядер. да и то - если ты сможешь распределить адекватно нагрузку. сугубо имхо.
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39717198
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Многопоточное приложение позволяет написать однотопоточный код и масштабировать его на сотни и тысячи клиентов.
В подавляющем большинстве случаев разница будет не между "эффективно - неэффективно", а между "уже работает" и "невозможно сделать в разумные сроки".
...
Рейтинг: 0 / 0
увеличивается количество потоков
    #39717247
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяmaytonА Дейкстра предложил что-то вместо потоков? В современном браузере например. Там - много задач которые
создают иллюзию параллельной работы. Как их кодить?
это воркеры
Логическое развитие этого вопроса я надеялся получить здесь 21703023 . К сожалению
после закрытия "сами-знаете-какого форума" - крокодил не ловится и не растет кокос да и вообще
в форуме остались студенты которым нужен зачот.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / увеличивается количество потоков
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]