`

多线程传递二进制信息

    博客分类:
  • java
阅读更多

7.3  线程间通信

迄今为止,我们所掌握的线程间通信手段还只限于主线程通过唤醒、中断机制向子线程发出信号,或者通过在创建子线程时向构造方法传入数据,以及设置子线程的公有属性值。在千变万化的应用需求面前,仅凭这些手段是难以胜任要求的。

在多线程开发领域,线程与线程之间经常需要交换信息,这是一种普遍存在的需求,并不仅限于主线程与子线程之间,子线程与子线程之间也很可能需要交换信息。

线程之间能够方便地基于共享地址空间实现通信,这本身便是多线程应用程序的一大优势,因为进程之间是不能互访对方的地址空间的,在进程之间传递信息只能采用类似于远程调用的手段。

本节介绍利用Java输入输出API中的内部管道(Pipe),在线程之间实现二进制信息和字符信息的传输。

7.3.1  传递二进制信息

利用 java.io.PipedOutputStream和java.io.PipedInputStream可以实现线程之间的二进制信息传输。 java.io.PipedOutputStream是java.io.OutputStream的直接子类,而java.io. PipedInputStream是java.io.InputStream的直接子类。

与OutputStream和 InputStream的最重要区别在于:PipedOutputStream拥有一个允许指定输入管道流的构造方法,而 PipedInputStream拥有一个允许指定输出管道流的构造方法。从而使得PipedOutputStream和 PipedInputStream往往成对出现、配合使用。

下面的例程演示利用java.io.PipedOutputStream和java.io.PipedInputStream在子线程thread1和thread2之间传递二进制信息。源代码如下。

代码清单7‑14  线程间通信的例程——CommunicationByPipeBytes

1.       import java.io.PipedOutputStream;

2.       import java.io.PipedInputStream;

3.       import java.io.IOException;

4.        

5.       public class CommunicationByPipeBytes

6.       {

7.           static PipedOutputStream pos=null;

8.           static PipedInputStream pis=null;

9.           

10.        public static void main(String[] args) throws IOException

11.        {

12.            pos=new PipedOutputStream();

13.            pis=new PipedInputStream(pos);

14.        

15.            Thread thread1=new Thread()

16.            {

17.                public void run()

18.                {

19.                    try

20.                    {

21.                        pos.write("hello".getBytes());

22.                        pos.flush();

23.                    }

24.                    catch(IOException ioe)

25.                    {

26.                        ioe.printStackTrace();

27.                    }

28.                }

29.            };

30.            thread1.start();

31.            

32.            Thread thread2=new Thread()

33.            {

34.                public void run()

35.                {

36.                    try

37.                    {

38.                        byte[] bytes=new byte[pis.available()];

39.                        pis.read(bytes,0,bytes.length);

40.                        System.out.println(new String(bytes));

41.                    }

42.                    catch(IOException ioe)

43.                     {

44.                         ioe.printStackTrace();

45.                     }   

46.                }

47.            };

48.            thread2.start();

49.        }

50.    }

线程thread1通过管道字节流向线程thread2传递字符串“hello”的字节。程序的运行结果是线程thread2在控制台上打印输出“hello”字样。

7.3.2  传递字符信息

本节介绍利用 java.io.PipedWriter和java.io.PipedReader在线程之间传输字符信息。与 java.io.PipedOutputStream和java.io.PipedInputStream类似,java.io.PipedWriter 是java.io.Writer的直接子类,java.io.PipedReader是java.io.Reader的直接子类。

与Writer和Reader的最重要区别在于,PipedWriter拥有一个允许指定输入管道字符流的构造方法,而PipedReader拥有一个允许指定输出管道字符流的构造方法。从而使得PipedWriter和PipedReader往往成对出现、配合使用。

下面的例程演示利用 java.io.PipedWriter和java.io.PipedReader在子线程thread1和thread2之间传递字符信息。为了读取字 符串的方便,本例程引入了java.io.BufferedWriter和java.io.BufferedReader。源代码如下。

代码清单7‑15  线程间通信的例程——CommunicationByPipeCharacters

1.       import java.io.PipedWriter;

2.       import java.io.PipedReader;

3.       import java.io.BufferedWriter;

4.       import java.io.BufferedReader;

5.       import java.io.IOException;

6.        

7.       public class CommunicationByPipeCharacters

8.       {

9.           static PipedWriter pw=null;

10.        static PipedReader pr=null;

11.        static BufferedWriter bw=null;

12.        static BufferedReader br=null;

13.        

14.        public static void main(String[] args) throws IOException

15.        {

16.            pw=new PipedWriter();

17.            pr=new PipedReader(pw);

18.            bw=new BufferedWriter(pw);

19.            br=new BufferedReader(pr);

20.        

21.            Thread thread1=new Thread()

22.            {

23.                public void run()

24.                {

25.                    try

26.                    {

27.                        bw.write("hello",0,"hello".length());

28.                        bw.newLine();

29.                        bw.flush();

30.                    }

31.                    catch(IOException ioe)

32.                    {

33.                        ioe.printStackTrace();

34.                    }

35.                }

36.            };

37.            thread1.start();

38.            

39.            Thread thread2=new Thread()

40.            {

41.                public void run()

42.                {

43.                    try

44.                    {

45.                        System.out.println(br.readLine());

46.                    }

47.                    catch(IOException ioe)

48.                     {

49.                         ioe.printStackTrace();

50.                     }   

51.                }

52.            };

53.            thread2.start();

54.        }

55.    }

线程thread1通过管道字符流向线程thread2传递字符串“hello”的字符。程序的运行结果是线程thread2在控制台上打印输出“hello”字样。

分享到:
评论

相关推荐

    分段读取二进制文件

    在实际应用中,可能还需要考虑错误处理、文件编码检测、多线程或异步操作等问题。对于标签中提到的“分段”和“读取”,这里主要讨论了如何通过分块读取技术来优化二进制文件的处理,以适应特定场景的需求,如示波器...

    ubuntu下使用C++生成cifar10二进制格式数据

    3. **二进制文件操作**:C++中的`std::fstream`类提供了`open()`方法,通过传递`ios::binary`标志来打开文件进行二进制写入或读取。 4. **数据结构设计**:CIFAR-10图像数据是像素值的数组,你需要定义一个结构体或...

    无API纯支持库 易语言多线程传递任意长字节集参数的方法

    标题提到的“无API纯支持库 易语言多线程传递任意长字节集参数的方法”是针对这种需求提供的一种解决方案。易语言是一种中文编程语言,它具有直观的语法和丰富的内置支持库,但默认情况下,线程间的通信并不直接支持...

    Linux系统下的多线程编程入门.pdf

    3. 信号量(Semaphore):计数型信号量用于控制多个线程对共享资源的访问,可以是二进制或计数形式。 4. 屏障(Barrier):线程同步到屏障点后,所有线程一起继续执行。 线程间通信通常涉及数据传递,可以使用以下...

    QT中利用TCP协议实现了一个多线程的文件互传系统

    3. **数据编码与打包**:在发送文件前,可能需要将文件内容编码为二进制或Base64等形式,以便于在网络上传输。同时,每个数据块应包含头部信息,如序列号、文件名和大小,以便接收端重组文件。 4. **多线程处理**:...

    多线程,线程里采用CClientDC绘图,线程里录制屏幕

    `Debug`和`Release`目录则包含编译后的调试和发布版本的二进制文件,如可执行文件和库文件。 总结来说,这个项目通过多线程技术实现了在不同的线程中同时进行绘图和屏幕录制功能。`CClientDC`用于线程安全的窗口...

    PB 回调函数,多线程

    1. **序列化与反序列化**:PB提供了将数据结构转换为二进制流(序列化)和从二进制流还原数据结构(反序列化)的功能。在多线程环境中,这可能会涉及线程安全问题,因此需要确保在多线程访问时正确同步。 2. **事件...

    POSIX多线程程序设计中文版+源码

    `errors.h`可能是自定义错误处理头文件,用于在遇到问题时提供更具体的错误信息,帮助调试多线程程序。 学习和理解这些概念,并结合实际代码示例,可以帮助开发者在POSIX环境中高效地编写多线程程序,解决并发问题...

    多线程技术文章

    "byte数组的转换.docx"可能涉及二进制数据在网络通信中的处理,这与多线程编程中的异步I/O相关。例如,Java的非阻塞NIO(New IO)库允许在一个线程中处理多个输入/输出操作,提高了服务端处理并发连接的能力。 总的...

    linux下 多线程模拟进程调度多线程模拟进程调度

    8. **信号量(Semaphores)**:另一种同步机制,可以用来控制多个线程对资源的访问数量,分为互斥信号量(二进制信号量)和计数信号量。 通过多线程模拟进程调度,我们可以实现类似的操作系统调度器,如轮转调度、...

    Linux多线程实现斐波那契数列.rar

    如果这个文件是二进制格式,可能包含了计算的中间值或最终斐波那契数列;如果是文本格式,可能列出了数列的项或者运行时间等信息。 通过分析和理解这个项目,我们可以学习到以下关键知识点: 1. Linux多线程编程:...

    Linux 多线程编程

    3. 信号量:计数型信号量用于控制资源的访问数量,二进制信号量等同于互斥锁。 4. 履行体(Semaphore):用于线程间同步,类似于互斥量,但具有唤醒所有等待线程的能力。 5. 读写锁:允许多个线程同时读取资源,但...

    数据流和多线程笔记

    - **字节流**:处理二进制数据,以8位字节的形式传输数据。 - **字符流**:处理文本数据,以16位Unicode字符的形式传输数据。 Java中用于处理数据流的主要包是`java.io`,该包中包含了大量用于文件和数据处理的类,...

    多线程传递任意长字节集参数的方法-易语言

    标题中的“多线程传递任意长字节集参数的方法”指的是在易语言中如何在多线程环境下传递长度可变的字节集数据。字节集是一种可以存储任意二进制数据的数据结构,它可以用于表示图片、音频、文本等各种类型的数据。在...

    TCP.rar_tcp 多线程_tcp群聊_多线程 TCP

    4. **数据封装与解封装**:TCP数据是以字节流的形式传输的,因此在发送和接收数据时,需要进行数据的封装和解封装,通常会使用特定的协议格式,如JSON或自定义的二进制格式,来保证信息的完整性和可理解性。...

    Posix多线程编程学习笔记

    ### Posix多线程编程学习笔记 #### 一、线程基础 ##### 1. 什么是线程? 在计算机程序中,线程是指一个进程中能够并发执行的基本单位。通俗地讲,线程就是一个进程内的多个执行路径。更精确地说,线程是“一个...

    易语言-无API纯支持库 易语言多线程传递任意长字节集参数的方法

    "传递任意长字节集参数"是指在多线程环境下,程序能够传递任意长度的数据块(字节集)作为参数,这些数据可能包含文本、图像、二进制文件等信息。在多线程编程中,正确地传递和管理这些参数是至关重要的,因为线程间...

    unix下多线程(exam).rar

    - **信号量(Semaphores)**:计数型或二进制信号量,用于控制对公共资源的访问。 - **读写锁(Read-Write Locks)**:允许多个读取者同时访问,但写入时独占。 5. **线程通信**: - **线程间信号(Thread ...

    QT多线程串口程序,

    对于汉字和十六进制格式的支持,串口通常以ASCII或二进制模式工作。发送汉字时,可以使用UTF-8编码将汉字转换为字节序列再发送;对于十六进制数据,需要将数据转换为对应的字符或字符串形式(如"0x1A")后再进行传输...

    基于posix多线程编程指南

    4. **信号量**:POSIX提供两种类型的信号量,二进制信号量和计数信号量,用于限制资源的并发访问。 **三、线程安全** 1. **线程安全函数**:在多线程环境中,有些函数是线程安全的,意味着它们可以在任意时刻被...

Global site tag (gtag.js) - Google Analytics