任务间使用管道进行输入输出

内容:通过输入/输出在线程间进行通信通常很有用。利用PipedWriter类(允许任务向管道写)和PipedReader类(允许不同任务从同一个管道中读取)。下面代码中Sender和Receiver代表了需要相互通信的两个任务。Sender把数据放进Writer,然后休眠一段时间。然而,Receiver没有sleep()和wait()。但当他调用read()时,如果没有更多的数据,管道将阻塞,而普通I/O是不能打断的。

class Sender implements Runnable {
	private Random rand = new Random(47);
	private PipedWriter out = new PipedWriter();

	public PipedWriter getPipedWriter() {
		return out;
	}

	@Override
	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) {
			System.out.println(e + " Sender write exception");
		} catch (InterruptedException e) {
			System.out.println(e + "Sender sleeo interrupted");
		}
	}
}

class Receiver implements Runnable {
	private PipedReader in;

	public Receiver(Sender sender) throws IOException {
		in = new PipedReader(sender.getPipedWriter());
	}

	@Override
	public void run() {
		try {
			while (true) {
				System.out.println("Read: " + (char)in.read() + ". ");
			}
		} catch (IOException e) {
			System.out.println(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();
	}
}
时间: 2024-10-18 09:50:33

任务间使用管道进行输入输出的相关文章

java 线程 生产者-消费者与队列,任务间使用管道进行输入、输出 讲解示例 --thinking java4

package org.rui.thread.block2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedB

C语言学习009:管道连接输入输出

现在我们需要对gpsdata.csv文件中的数据进行筛选,然后将符合条件的数据输出到output.json文件中,第一种方式当然是在之前的代码中进行修改,但是如果我们不想修改原来的代码就能得到我们期望的结果,该如何实现呢? 42.0908,-71.2316,speed=21 37.1908,-74.2322,speed=19 42.0908,-71.3312,speed=20 44.5908,-70.2314,speed=17 39.0908,-62.2512,speed=19 43.0908,

TIJ -- 任务间使用管道进行输入/输出

1. 通过输入/输出在线程间进行通信通常很有用.提供线程功能的类库以"管道"的形式对线程间的输入/输出提供了支持.它们在Java输入/输出类库中的对应物就是PipedWriter类(允许任务向管道写)和PipedReader类(允许不同任务从同一个管道中读取).这个模型可以看成是"生产者 - 消费者"问题的变体,这里的管道就是一个封装好的解决方案.管道基本上是一个阻塞队列,存在于多个引入BlockingQueue之前的Java版本中. 2. 下面是一个简单例子,两个

linux学习(三)输入输出重定向和管道功能、cat命令、more命令

目录 输入输出重定向 输出重定向 管道功能 cat命令 more命令 @(输入输出重定向和管道功能) 输入输出重定向 输入重定向可以让用户将某个文件作为输入设备,输出重定向可以把某个文件作为输出设备,从而使文件更加灵活 输入重定向的符号使"<",执行该命令,"<"后面的文件替代用户从键盘的输入内容 例如将file文件的内容发送到某个邮箱 [[email protected] ~]#mail -s "test mail" [email 

硬软链接的区别 节点 以及重定向和管道

INODE全称叫index node 表中包含文件系统所有文件列表 一个节点是在一个表项 包含有关文件的信息 ( 元数据 ) 包括: 文件类型,权限,UID,GID 链接数(指向这个文件名路径名称个数) 该文件的大小和不同的时间戳 指向磁盘上文件的数据块指针 有关文件的其他数 1 文件引用一个是 inode号 2 我们是通过文件名来引用一个文件 3 一个目录是目录下的文件名和文件inode号之间的映射 由于 inode 找数据是不断地 创建新的节点 所以他的节点创建有局限性 而他的最大数量可为

【UNIX网络编程】进程间通信之管道

管道是最早的Unix进程间通信形式,它存在于全部的Unix实现中.关于管道,有例如以下几点须要知道: 1.它是半双工的,即数据仅仅能在一个方向上流动.虽然在某些Unix实现中管道能够是全双工的.但须要对系统进行某些设置.在Linux系统中,它是半双工的. 2.它没有名字.因此仅仅能在具有公共祖先的进程之间使用. 通经常使用在父子进程间.虽然这一点随着"有名管道FIFO"的增加得到改正了.但应该把它们看作是两种不同的进程间通信方式. 3.它由pipe函数创建,read和write函数訪问

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个阳光明媚的周末,一个又一个的周末,周而复始,不断学习,前方的路你可曾看见?随我一起走进技术的世界,流连忘返吧! 一.打印流PrintWriter 打印流有PrintWriter和PrintStream,他的特点可以直接操作输入流还有文件 该流提供了打印方法,可以将各种数据类型原样打印 file对象

《APUE》中的函数整理

第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. 2.void perror(const char *s) 该函数基于当前的errno值,在标准出错文件中输出一条出错消息,然后返回.声明在stdio.h文件中.它首先输出由s指向的字符串,然后是一个冒号,一个空格,接着是errno值对应的出错信息,最后是一个换行符. 第2章 UNIX标准化及实现

Bash特性总结

Bash 是 GNU 计划中重要的工具软件之一,目前也是 Linux distributions 的标准 shell . bash 主要兼容于 sh ,并且依据一些使用者需求,而加强的 shell 版本.不论你使用的是那个 distribution ,你都难逃需要学习 bash 的宿命!那么这个 shell 有什么好处,干嘛 Linux 要使用他作为默认的 shell 呢? bash 主要的优点有底下几个: 命令历史 命令补全.路径补全 命令替换 命令行展开 命令别名 glob通配符 bash快