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

Многопоточность

16.02.2013, 18:39. Показов 1864. Ответов 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
private void button1action() throws InterruptedException {
        String path = parent.tfield2.getText();
        File file = new File(path);
        file.mkdir();
        File[] fileList = file.listFiles();
        System.out.println(fileList.length);
        long time1 = System.currentTimeMillis();
 
 
        for (File f: fileList) {
            CountThread thread = new CountThread(f);
            thread.t.join();
        }
 
 
        long time2 = System.currentTimeMillis();
        long time = time2 - time1;
        EnterWindow.tarea.setText("");
        EnterWindow.tarea.repaint();
        EnterWindow.tarea.setText(EnterWindow.text);
        System.out.println("Время с потоками:    " + time);
 
    }
Без потоков:
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
private void button3action() throws IOException {
        String path = parent.tfield2.getText();
        File file = new File(path);
        file.mkdir();
        File[] fileList = file.listFiles();
        System.out.println(fileList.length);
 
        String text = "";
 
        long time1 = System.currentTimeMillis();
        for (File f: fileList) {
            Reader freader = new FileReader(f);
            BufferedReader reader = new BufferedReader(freader);
 
            int stringNumber = 0;
 
            while (reader.readLine()!=null) { stringNumber++; }
 
            text = text  + f.getName() + " : " + stringNumber + System.getProperty("line.separator");
 
            reader.close();
            freader.close();
        }
        long time2 = System.currentTimeMillis();
        long time = time2 - time1;
 
        EnterWindow.tarea.setText("");
        EnterWindow.tarea.setText(text);
        System.out.println("Время без потоков   " + time);
    }
И там и там время получается примерно 550 миллисекунд. Я грешу на то, что когда в цикле создается следующий поток то после метода join следующий дожидается его окончания. Может быть их нужно посоздавать, а потом также через цикл закрыть? или во время join блокируется только основной поток?

А еще забыл указать - если убрать из цикла join то время получается 4-5 милисекунд. Но при это мы не получаем результат после первого нажатия кнопки, только после второго нажатия. Мистика ))) помогите разобраться.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.02.2013, 18:39
Ответы с готовыми решениями:

Многопоточность
Мне нужно что бы сообщение System.out.println(String.format("%1$s будит парикмахера.", client.getName())); выводилось только один раз. В...

Многопоточность
Здравствуйте, что-то у меня не выходит ... Должно быть так А . . В А . . В А . . В ... и т.д.

Многопоточность
сделать Дизайн приложения, по крайней мере из двух нитей: - Один для обработки массива - Один для написания результатов в файл.из 2...

5
51 / 49 / 7
Регистрация: 31.10.2011
Сообщений: 98
18.02.2013, 20:53
Так вы в "многопоточном" варианте создаёте Thread и тут же ждёте его завершения. Если хотите распараллелить - создайте массив Thread'ов, и вызывайте join для каждого из них в конце. Но учитывайте, что последовательное прочитать N байт, скорее всего, будет быстрее, чем параллельно J * M = N байт.
0
16 / 16 / 8
Регистрация: 27.12.2012
Сообщений: 103
Записей в блоге: 1
19.02.2013, 19:03
У меня тоже был похожий вопрос
0
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 34
19.02.2013, 20:15  [ТС]
Бюбюбю =( что за бредор, я вот так и знал, что неправильно понял метод join - я считал, что ожидает завершение только тот поток, из которого был вызван метод, т.е. главный, и он же ждет все создаваемые потоки. А получается что только создался поток, и тут же следующий должен ожидать окончания предыдущего.. я правильно понял? Тогда выгоды в скорости не будет - ибо в цикле одновременно с созданием потоков будет набиваться массив, а затем будет еще цикл по массиву, который будет вызывать метод join на каждом потоке...

Добавлено через 1 минуту
О! спс
0
51 / 49 / 7
Регистрация: 31.10.2011
Сообщений: 98
19.02.2013, 21:01
Если попробовать это нарисовать, то ваш вариант выглядит так: вы создаёте Thread CountThread из главного Thread'а. В это время они могут выполняться одновременно. Потом вы в главном Thread'е вызываете join - главный Thread начинает ожидать завершения CountThread'а, не делая ничего полезного. По сути получается, что выполнение последовательное, хотя и в разных потоках. Если попытаться изобразить их выполнение, то оно выглядит примерно так:
главный Thread *--* * -----
CountThread *------*
Для "параллелизма" вам нужно создать несколько CountThread'ов, после чего все их join'ить - тогда оно может быть быстрее (для вычислительных задач скорее всего, будет, для чтения файлов - может быть медленнее).
1
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 34
22.02.2013, 08:40  [ТС]
Подскажите пожалуйста, хочу немного переделать свою тестовую программу - в ней есть таблица, которая через форму забивается данными, а затем сохраняется в файл при выходе из программы. Так вот я теперь хочу добавить вторую таблицу и оформить ее как свинг-вкладку, у нее будут немного другие столбцы и как следствие данные будут сохраняться в другом файле. Подскажите как с помощью потоков распараллелить их работу и стоит ли это делать, т.е. где примерно будет точка входа в новый поток?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.02.2013, 08:40
Помогаю со студенческими работами здесь

Многопоточность
Добрый день, уважаемые гуру многопоточного программирование. Если Вас не затруднит, ответьте пожалуйста на несколько вопросов: 1 К...

Многопоточность
Стоит задание с целью обучения управления потоками нужно посчитать ряд Лейбница или просто число пи. Один поток должен считать это число и...

Многопоточность
Данный код должен в теории выдавать произвольное число (в определенном интервале). У меня четко каждый раз 200 000. В чем ошибка? ...

Многопоточность
Люди, не могли бы вы на пальцах объяснить, что такое пул потоков, а то перечитал тучу статей, а все равно не совсем представляю себе что...

Многопоточность
Доброго времени. Не могу сообразить как сделать: Задача: Методы класса Main вызываются из разных потоков. Нужно получить статистику...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Подключение 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