Поддерживают ли Java сокеты полный дуплекс?
Вопрос:
Возможно ли организовать таким образом работу с сокетом в Java, чтобы один поток записывал данные в OutputStream
сокета, в то время как другой поток считывал данные из InputStream
этого же сокета, без необходимости синхронизации потоков при работе с сокетом?
1 ответ(ов)
Конечно. Точная ситуация, которую вы описываете, не должна вызывать проблем (одновременное чтение и запись).
Как правило, поток чтения будет блокироваться, если нет ничего для чтения, и может исчерпать время ожидания при операции чтения, если у вас установлен таймаут.
Поскольку входной и выходной потоки являются отдельными объектами в рамках сокета, единственное, о чем стоит беспокоиться, это что произойдет, если два потока попытаются одновременно читать или записывать (два потока, один и тот же входной/выходной поток)? Методы чтения/записи классов InputStream/OutputStream не синхронизированы. Тем не менее, возможно, что если вы используете подкласс InputStream/OutputStream, то методы чтения/записи, которые вы вызываете, синхронизированы. Вы можете проверить документацию javadoc для того класса/методов, которые вы используете, и быстро выяснить этот момент.
Разница между "wait()" и "sleep()" в Java
Как работают сервлеты? Инстанцирование, сессии, общие переменные и многопоточность
Что значит 'synchronized'?
Почему методы wait() и notify() объявлены в классе Object в Java?
Когда следует использовать поток Java вместо Executor?