Бесплатный курс по Java: от основ до продвинутого уровня
PipedStream в Java: передача данных между потоками
PipedInputStream, PipedOutputStream – применяется в многопоточной среде. Потоки в слове многопоточной, это не те потоки, которые мы сейчас изучаем (сейчас мы изучаем потоки ввода вывода). Эти же потоки понимайте как куски кода, которые выполняются параллельно. То есть в одном потоке один кусок кода, в другом другой и т.д, но главное все они выполняются параллельно друг другу.
PipedInputStream, PipedOutputStream связывают два потока I/O для для того чтобы они могли обмениваться информацией друг с другом.
Для передачи каких-либо данных между разными потоками лучше всего использовать этот класс.
Хотя потоки мы пока не разбирали, всё равно приведем пример.
Пример программы:
import java.io.*;
import java.util.*;
class PipedStreamLesson {
// Например, есть 2 независимых потока: ThreadA и ThreadB.
// Их классы создаются снизу после класса PipedStreamLesson.
// Это не те потоки, которые мы сейчас изучаем
// (сейчас мы изучаем потоки ввода-вывода).
// Эти же потоки понимайте как два куска кода,
// которые выполняются параллельно.
// То есть содержимое метода run() в ThreadA выполняется
// параллельно содержимому run() в ThreadB.
public static void main(String[] args) {
// Создаем концы канала: выходной и входной.
PipedInputStream pis;
PipedOutputStream pos;
try {
// Связываем в единый канал
// для передачи данных между ними.
pis = new PipedInputStream();
pos = new PipedOutputStream(pis);
// Запускаем потоки.
// После этого содержимое методов run
// в этих классах начнет выполняться параллельно.
new ThreadB(pis).start();
new ThreadA(pos).start();
// Также в эти потоки передаем связанные
// каналы pis и pos, которые будут
// использоваться для пересылки и считывания данных.
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
class ThreadA extends Thread {
PipedOutputStream pos;
ThreadA(PipedOutputStream pos) {
this.pos = pos;
}
@Override
public void run() {
try {
byte[] bytes = new byte[] {‘a’, ‘g’, ‘b’, ‘c’, ‘6’};
for (byte b : bytes) {
// Используем переданный в конструктор pos
// для передачи массива bytes в ThreadB.
pos.write(b);
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class ThreadB extends Thread {
PipedInputStream pis;
ThreadB(PipedInputStream pis) {
this.pis = pis;
}
@Override
public void run() {
try {
int b = 0;
// pis считывает данные, передаваемые pos
// из ThreadA.
while ((b = pis.read()) != -1) {
System.out.println((char) b);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Вывод:
Как видим данные успешно пересланы в другой поток и выведены им на консоль.