Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как передавать данные между потоками(threads) ? / 25 сообщений из 30, страница 1 из 2
29.06.2014, 23:52
    #38683232
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передавать данные между потоками(threads) ?
Читая про 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
29.06.2014, 23:55
    #38683233
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передавать данные между потоками(threads) ?
questioner ,
Опишите задачу, которую вы решаете. В конкурентной разработке эти пайпы - экзотика. Расшарили переменную между потоками, и вперед.
...
Рейтинг: 0 / 0
29.06.2014, 23:56
    #38683235
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передавать данные между потоками(threads) ?
DEVcoach,

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

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

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

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

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

по картинке сужу, но я в этой теме совсем плох, поэтому хотелось бы разъяснений.
...
Рейтинг: 0 / 0
30.06.2014, 02:14
    #38683275
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передавать данные между потоками(threads) ?
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
30.06.2014, 09:31
    #38683358
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передавать данные между потоками(threads) ?
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
30.06.2014, 10:05
    #38683384
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передавать данные между потоками(threads) ?
Basil A. SidorovquestionerТакже в меня вседяются опасения после таких формацлировок в javadoc:
пропущено...
Пророки предупреждают, что если в вы сделаете чтение из PipedOutputStream, но при этом другая часть ваша вашего кода в этом же потоке (ещё) ничего не записала в PipedInputStream - будет классическая блокировка.

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

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

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

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


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


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

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

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




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

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

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

а nio ? ее же вроде как позиционируют как неблокируюшее сушество ? получается в ней нет этой проблемы?
...
Рейтинг: 0 / 0
30.06.2014, 12:24
    #38683579
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передавать данные между потоками(threads) ?
redwhite90У меня ещё один вброс на эту тему)
Тут уже проскользнуло в обсуждении что пайпы бывают в io и в nio. Наша беседа шла про io в основном. Как выяснилось, существует проблема блокировки.
а nio ? ее же вроде как позиционируют как неблокируюшее сушество ? получается в ней нет этой проблемы?
JavaDoc лениво ковырять. Но, на сколько я понимаю, все те же самые фишки что и в NIO. Блокирующий\неблокирующий режимы. Блокирующий работает как в IO. Неблокирующий, просто выйдет из метода, сообщив что ничего не записано или не прочитано.
...
Рейтинг: 0 / 0
30.06.2014, 13:28
    #38683667
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передавать данные между потоками(threads) ?
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
30.06.2014, 13:31
    #38683671
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передавать данные между потоками(threads) ?
Там буфер на 1024.
...
Рейтинг: 0 / 0
30.06.2014, 13:33
    #38683674
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передавать данные между потоками(threads) ?
BlazkowiczТам буфер на 1024.

буфер чего?

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

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

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

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

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

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

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

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


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