powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как передавать данные между потоками(threads) ?
30 сообщений из 30, показаны все 2 страниц
Как передавать данные между потоками(threads) ?
    #38683232
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Читая про I/O не без удивления заметил, что для этой цели рекомендуется использовать
PipedInputStream/PipedOutputStream.

Поясните, что они такого особого предоставляют ?

Также в меня вседяются опасения после таких формацлировок в javadoc:
http://docs.oracle.com/javase/7/docs/api/java/io/PipedInputStream.html Attempting to use both objects from a single thread is not recommended, as it may deadlock the thread


Почему просто не сделать какой-то объект, который виден вовлеченным в процесс потоками и записывать в него данные, соблюдая правила happens-before?

Что-то в моей логике явно криво. Помогите разобраться.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683233
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questioner ,
Опишите задачу, которую вы решаете. В конкурентной разработке эти пайпы - экзотика. Расшарили переменную между потоками, и вперед.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683235
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DEVcoach,

никакой конкретной проблемы не решаю. Улучшаю свои знания в java se.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683237
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redwhite90DEVcoach,
никакой конкретной проблемы не решаю. Улучшаю свои знания в java se.Понятно, тогда можете смело забить на эти пайпы :-)
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683244
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DEVcoachredwhite90DEVcoach,
никакой конкретной проблемы не решаю. Улучшаю свои знания в java se.Понятно, тогда можете смело забить на эти пайпы :-)

а тут слово "эти" несёт какую-то смысловую нагрузку? ну всмысле ещё какие-то пайпы есть?
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683254
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner, вот тут про пайпы доходчиво и сердито

http://tutorials.jenkov.com/java-nio/pipe.html

Кажется больше и добавить нечего.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683256
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

хм, а нафига одно и то же в IO и в NIO ?
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683259
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему одно и тоже?
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683261
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

по картинке сужу, но я в этой теме совсем плох, поэтому хотелось бы разъяснений.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683275
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerТакже в меня вседяются опасения после таких формацлировок в javadoc:
http://docs.oracle.com/javase/7/docs/api/java/io/PipedInputStream.html Attempting to use both objects from a single thread is not recommended, as it may deadlock the threadПророки предупреждают, что если в вы сделаете чтение из PipedOutputStream, но при этом другая часть ваша вашего кода в этом же потоке (ещё) ничего не записала в PipedInputStream - будет классическая блокировка.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683358
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerЧитая про I/O не без удивления заметил, что для этой цели рекомендуется использовать
PipedInputStream/PipedOutputStream.
Подозреваю что исходное утверждение сильно отличается от того что написано здесь. Никто не рекомендует передавать данные между потоками используя Piped Stream. Вы что-то читаете, про Piped Stream. Но это совершенно не обозначает что оно решает задачу передачит данных между потоками для всех случаев жизни.


questioner
Также в меня вседяются опасения после таких формацлировок в javadoc:
http://docs.oracle.com/javase/7/docs/api/java/io/PipedInputStream.html Attempting to use both objects from a single thread is not recommended, as it may deadlock the thread

Это ключевой момент для понимания Piped Stream.

questionerПочему просто не сделать какой-то объект, который виден вовлеченным в процесс потоками и записывать в него данные, соблюдая правила happens-before?

Потому что речь про IO и про Stream, а не про обмен данными между потоками вообще.

questionerЧто-то в моей логике явно криво. Помогите разобраться.
Логика примерно такая же как при испольховании класса Process. Вы с ним разбирались уже? Когда процесс пишет что-то в out, то ваш Java код, должен это вычитывать. Иначе процесс заблокируется на IO. Так и здесь. Один поток пишет stream, второй читает. Как только один из них перестаёт читать или писать, то второй заблокируется, пытаясь сделать обратную операцию.

Можно представить двух человек на ковеере. Один передаёт другому кирпичи. Если передающий займентся чем-то другим, то принимающий будет его ждать. Но не сможет ничего делать. Ведь в любой момент может прилететь кирпич от передающего.
И аналогично в обратную сторону. Если принимающий займется чем-то другим, то передающий застопорится с кирпичом в руках. Ни положить. Ни отдать. Только interrupt :)
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683384
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovquestionerТакже в меня вседяются опасения после таких формацлировок в javadoc:
пропущено...
Пророки предупреждают, что если в вы сделаете чтение из PipedOutputStream, но при этом другая часть ваша вашего кода в этом же потоке (ещё) ничего не записала в PipedInputStream - будет классическая блокировка.

А в чем принципиальная разница в один поток это всё делается или в несколько?

Для меня классический deadlock это с двумя синхронайзами в разном порядке.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683391
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
авторМожно представить двух человек на ковеере. Один передаёт другому кирпичи. Если передающий займентся чем-то другим, то принимающий будет его ждать. Но не сможет ничего делать. Ведь в любой момент может прилететь кирпич от передающего.
И аналогично в обратную сторону. Если принимающий займется чем-то другим, то передающий застопорится с кирпичом в руках. Ни положить. Ни отдать. Только interrupt :)

теперь понятно)

Это как в ArrayBlockingQueue например
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683393
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczquestionerЧитая про I/O не без удивления заметил, что для этой цели рекомендуется использовать
PipedInputStream/PipedOutputStream.
Подозреваю что исходное утверждение сильно отличается от того что написано здесь. Никто не рекомендует передавать данные между потоками используя Piped Stream. Вы что-то читаете, про Piped Stream. Но это совершенно не обозначает что оно решает задачу передачит данных между потоками для всех случаев жизни.


questioner
Также в меня вседяются опасения после таких формацлировок в javadoc:
пропущено...


Это ключевой момент для понимания Piped Stream.

questionerПочему просто не сделать какой-то объект, который виден вовлеченным в процесс потоками и записывать в него данные, соблюдая правила happens-before?

Потому что речь про IO и про Stream, а не про обмен данными между потоками вообще.




Ок, общественное мнение говорит, что про пайпы стоит знать только то, что они существуют)
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683399
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerА в чем принципиальная разница в один поток это всё делается или в несколько?

В том что в один поток оно не делает в принципе.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683403
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerОк, общественное мнение говорит, что про пайпы стоит знать только то, что они существуют)
Именно. На практике применяется довольно редко.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683421
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerА в чем принципиальная разница в один поток это всё делается или в несколько?Это как разница между последовательным и параллельным соединением
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683569
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня ещё один вброс на эту тему)

Тут уже проскользнуло в обсуждении что пайпы бывают в io и в nio. Наша беседа шла про io в основном. Как выяснилось, существует проблема блокировки.

а nio ? ее же вроде как позиционируют как неблокируюшее сушество ? получается в ней нет этой проблемы?
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683579
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90У меня ещё один вброс на эту тему)
Тут уже проскользнуло в обсуждении что пайпы бывают в io и в nio. Наша беседа шла про io в основном. Как выяснилось, существует проблема блокировки.
а nio ? ее же вроде как позиционируют как неблокируюшее сушество ? получается в ней нет этой проблемы?
JavaDoc лениво ковырять. Но, на сколько я понимаю, все те же самые фишки что и в NIO. Блокирующий\неблокирующий режимы. Блокирующий работает как в IO. Неблокирующий, просто выйдет из метода, сообщив что ничего не записано или не прочитано.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683667
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

кстати это дедлок?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
        PipedInputStream pipedInputStream = new PipedInputStream();
        PipedOutputStream pipedOutputStream = new PipedOutputStream();
        pipedOutputStream.connect(pipedInputStream);


        ObjectOutputStream objectOutputStream = new ObjectOutputStream(pipedOutputStream);
        ObjectOutputStream objectOutputStreamWrapper = new ObjectOutputStream(objectOutputStream);     //double wrapping

        objectOutputStreamWrapper.writeObject("this is my string");

        ObjectInputStream objectInputStream = new ObjectInputStream(pipedInputStream);
        ObjectInputStream   objectInputStreamWrapper = new ObjectInputStream(objectInputStream);

        System.out.println(objectInputStreamWrapper.readObject());




P.S. если дважды не оборачивать - всё работает.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683671
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там буфер на 1024.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683674
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczТам буфер на 1024.

буфер чего?

как влияет двойное оборачивание?
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683679
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90буфер чего?

Буфер байт. Чего же ещё? До его переполнения, вероятно, не блокируется.

redwhite90как влияет двойное оборачивание?
Это у тебя что-то сродни double penetration? В извращениях ковыряться желания не имею.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683704
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczredwhite90буфер чего?

Буфер байт. Чего же ещё? До его переполнения, вероятно, не блокируется.

Из ответа понял, что буфер пайпа)

redwhite90как влияет двойное оборачивание?
Это у тебя что-то сродни double penetration? В извращениях ковыряться желания не имею.[/quot]

согласен, извращение, но я предположил, что если пойму как это работает - пойму как декоратор I/O работает
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38683983
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

оказалось, что дело во флаше.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38684127
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pipedstream вообще очень классная штука. В одном потоке если, то использовать available, тогда блокировок не будет.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38684198
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте 2 юзкейса сочиним. IO, nio. Два потока. Работают в конвейере.

И посмотрим как чего. Целевая функция - минимизация времени работы двух потоков.
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38684211
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonДавайте 2 юзкейса сочиним. IO, nio. Два потока. Работают в конвейере.

И посмотрим как чего. Целевая функция - минимизация времени работы двух потоков.

Гуд идея)
Честно говоря идея наверное не очень, но дабы проявить инициативу - озвучу.

на вход даём "войну и мир" считываем из нее все числа,

Второй поток - раскладываем на простые множители произведения чисел пришедших из первого потока следущим образом.
1 строка - разложение на простые множители(1 пришедшее число)
2 строка - разложение на простые множители(1 число * 2 число)
3 строка - разложение на простые множители(1 число * 2 число * 3 число)
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38684413
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не помню сколько чисел в Войне и Мире но кажется очень мало.
Второй поток будет просто вхолостую принимать данные.

Лучше пускай первый будет делать дисковые операиции а второй
- тектстовый анализ. К примеру - построение гистограммы всех слов
...
Рейтинг: 0 / 0
Как передавать данные между потоками(threads) ?
    #38684831
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-бы еще расширил постановку и создал пул потоков 1-уровня и 2-го. По аналогии
с процессингом сложных задач в hadoop. Но будучи перфекционистом я уже месяц
топчусь вокруг этого пула и всё никак не могу запилить простую индексацию текстовых
и xml-файлов типа Ebook.

P.S. Прав был Фамусов....
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Как передавать данные между потоками(threads) ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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