Java 使用pipe进行线程间通讯

Thinking in Java 中的例子,两个线程Sender&Receiver使用pipe进行通讯。Pipe是一个阻塞队列,解决了“生产者-消费者”线程通讯的问题。

 1 import java.io.IOException;
 2 import java.io.PipedReader;
 3 import java.io.PipedWriter;
 4 import java.util.concurrent.ExecutorService;
 5 import java.util.concurrent.Executors;
 6
 7 class Sender implements Runnable
 8 {
 9     PipedWriter pipedWriter=new PipedWriter();
10     @Override public void run() {
11         try {
12             for (char a = ‘a‘; a <= ‘z‘; a++) {
13                 Thread.sleep(500);
14                 pipedWriter.write(a);
15                 //block
16             }
17         } catch (InterruptedException e) {
18             e.printStackTrace();
19         } catch (IOException e)
20         {
21             System.out.println("Close Pipe");
22         }
23     }
24     PipedWriter getPipedWriter()
25     {
26         return pipedWriter;
27     }
28 }
29 class Reciever implements Runnable
30 {
31     PipedReader pipedReader=null;
32     @Override public void run()
33     {
34         try{
35             while (true)
36             {
37                 char a=(char)pipedReader.read();
38                 System.out.print(a+", ");
39                 //block while nothing in the pipe
40             }
41         }catch (IOException e)
42         {
43             System.out.println("Close Pipe");
44         }
45     }
46     public Reciever(Sender sender) throws IOException
47     {//获得pipe
48         pipedReader=new PipedReader(sender.getPipedWriter());
49     }
50 }
51 public class Main{
52     public static void main(String[]args)
53     {
54         try {
55             Sender sender = new Sender();
56             Reciever reciever = new Reciever(sender);
57             ExecutorService service= Executors.newCachedThreadPool();
58             service.execute(sender);
59             service.execute(reciever);
60             Thread.sleep(20000);//跑一会
61             service.shutdown();//关闭
62             System.out.println("Over!");
63         }catch (IOException e)
64         {
65             e.printStackTrace();
66         }catch (InterruptedException e)
67         {
68             e.printStackTrace();
69         }
70
71     }

原文地址:https://www.cnblogs.com/QEStack/p/8323640.html

时间: 2024-11-08 12:45:13

Java 使用pipe进行线程间通讯的相关文章

Java 线程间通讯

/* 线程间通讯: 多个线程在处理同一资源,但是任务却不同. */ package com.cwcec.test; class Input implements Runnable { Resource r; public Input(Resource r) { this.r = r; } public void run() { int x = 0; while(true) { synchronized (r) { if(x == 0) { r.name = "Mike"; r.sex

iOS开发多线程-线程间通讯

一.NSThread 线程间的通讯 1 - (void)demoAboutNSThread 2 { 3 NSLog(@"demoAboutNSThread %@", [NSThread currentThread]); 4 NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(longTimeOperation) object:nil]; 5 [thread start]; 6 } 7

线程间通讯

线程间通讯:把一个线程中计算的结果传递到另一个线程中使用. 示例场景:子线程下载网络图片,回主线程更新UI. NSThread示例代码: 1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 4 // 子线程下载网络数据 5 [self performSelectorInBackground:@selector(downloadImage) withObject:nil]; 6 } 7 8 // 加载网络数据,耗时操作,在子线程中进行 9 - (voi

19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对

Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

Java并发编程系列[未完]: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) 一.线程的状态 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态). New:新建状态,当线程创建完成时为新

iOS--多线程之线程间通讯

线程间通讯 一.NSThread 1.简单说明 ①线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 ②线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 ③线程间通信常用方法 // waitUntilDone的含义: // 如果传入的是YES: 那么会等到主线程中的方法执行完毕, 才会继续执行下面其他行的代码 // 如果传入的是NO: 那么不用等到主线程中的方法执行完毕, 就可以继续执行下面其他行的低吗 /* *

C#线程间通讯

using System;using System.Text;using System.Windows.Forms;using System.Threading; namespace 线程间通讯{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        //1.创建Invoke函数,大致如下:        

有多少人在面试时,被Java 如何线程间通讯,问哭了?

正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点: thread.join(), object.wait(), object.notify(), CountdownLatch, CyclicBarrier, FutureTask, Callable 下面我从几个例子作为切入点来讲解下 Java 里有哪些方法来实现线程间通信. 如何让两个线程依次执行? 那如何让 两个线程按照指定方式有序交叉运行

Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态.然后等待消费者消费了商品,然后消费者通知生产者队列有空间了.同样地,当