Контрольная работа: Программирование на Java

int willRead = pipeIn.available();

if(willRead+countRead>toRead.length)

//Нужно считать только до предела массива

willRead = toRead.length-countRead;

countRead += pipeIn.read(toRead, countRead, willRead);

}

} catch (IOException e) {

System.out.println ("Impossible IOException occur: ");

e.printStackTrace();

}

Данный пример носит чисто демонстративный характер (в результате его работы массив toRead будет заполнен случайными числами). Более явно выгода от использования PipedI/OStream в основном проявляется при разработке многопоточного приложения. Если в программе запускается несколько потоков исполнения, организовать передачу данных между ними удобно с помощью этих классов. Для этого нужно создать связанные объекты PipedI/OStream, после чего передать ссылки на них в соответствующие потоки. Поток выполнения, в котором производится чтение данных, может содержать подобный код:

// inStream - объекткласса PipedInputStream

try {

while(true) {

byte[] readedBytes = null;

synchronized(inStream) {

int bytesAvailable = inStream.available();

readedBytes = new byte[bytesAvailable];

inStream.read(readedBytes);

}

// обработка полученных данных из readedBytes

// …

} catch(IOException e) {

/* IOException будет брошено, когда поток inStream, либо

связанный с ним PipedOutputStream, уже закрыт, и при этом

производится попытка считывания из inStream */

System.out.println("работа с потоком inStream завершена");

}

Если с объектом inStream одновременно могут работать несколько потоков выполнения, то необходимо использовать блок synchronized (как и сделано в примере), который гарантирует, что в период между вызовами inStream.available() и inStream.read(…) ни в каком другом потоке выполнения не будет производиться считывание из inStream. Поэтому вызов inStream.read(readedBytes) не приведет к блокировке и все данные, готовые к считыванию, будут считаны.

К-во Просмотров: 379
Бесплатно скачать Контрольная работа: Программирование на Java