русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Использование каналов для ввода/вывода между потоками


Дата добавления: 2015-06-12; просмотров: 886; Нарушение авторских прав


Часто бывает полезно организовать взаимодействие потоков посредством механизмов ввода/вывода. Библиотеки потоков могут предоставлять поддержку ввода/вывода между потоками в форме каналов (pipes). Последние представлены в стандартной библиотеке ввода/вывода Java классами PipedWriter (позволяет потоку записывать в канал) и PipedReader (предоставляет возможность другому потоку считывать из того же канала).

Простой пример взаимодействия двух потоков через канал:

//: concurrency/PipedIO.java

// Использование каналов для ввода/вывода между потоками

import java.util.concurrent.*;

import java.io.*;

import java.util.*;

import static net.mindview.util.Print.*;

 

class Sender implements Runnable {

private Random rand = new Random(47);

private PipedWriter out = new PipedWriter();

public PipedWriter getPipedWriter() { return out; }

public void run() {

try {

while(true)

for(char c = 'A'; c <= 'z'; c++) {

out.write(c);

TimeUnit.MILLISECONDS.sleep(rand.nextInt(500));

}

} catch(IOException e) {

print(e + " Sender write exception");

} catch(InterruptedException e) {

print(e + " Sender sleep interrupted");

}

}

}

 

class Receiver implements Runnable {

private PipedReader in;

public Receiver(Sender sender) throws IOException {

in = new PipedReader(sender.getPipedWriter());

}

public void run() {

try {

while(true) {

// Блокируется до появления следующего символа:

printnb("Read: " + (char)in.read() + ", ");

}

} catch(IOException e) {

print(e + " Receiver read exception");

}

}

}

 

public class PipedIO {

public static void main(String[] args) throws Exception {

Sender sender = new Sender();

Receiver receiver = new Receiver(sender);

ExecutorService exec = Executors.newCachedThreadPool();



exec.execute(sender);

exec.execute(receiver);

TimeUnit.SECONDS.sleep(4);

exec.shutdownNow();

}

}

<spoiler text="Output:"> (65% match)

Read: A, Read: B, Read: C, Read: D, Read: E, Read: F, Read: G, Read: H, Read: I,

Read: J, Read: K, Read: L, Read: M,

java.lang.InterruptedException: sleep interrupted Sender sleep interrupted

java.io.InterruptedIOException Receiver read exception

</spoiler> Классы Sender и Receiver представляют задачи, которые должны взаимодействовать друг с другом. В классе Sender создается канал PipedWriter, существующий как автономный объект, однако при создании канала PipedReader в классе Receiver конструктору необходимо передать ссылку на PipedWriter. Sender записывает данные в канал Writer и бездействует в течение случайно выбранного промежутка времени. Класс Receiver не содержит вызовов sleep() или wait(), но при проведении чтения методом read() он автоматически блокируется при отсутствии данных.

Заметьте, что потоки sender и receiver запускаются из main() после того, как объекты были полностью сконструированы. Если запускать не полностью сконструированные объекты, каналы на различных платформах могут демонстрировать несогласованное поведение.



<== предыдущая лекция | следующая лекция ==>
Методы wait() и notifyAII() | Взаимная блокировка


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.153 сек.