进程间通信的方法主要有以下几种:
(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
(2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关 系 进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。
(3)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送 信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。
(4)消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺
(5)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
(6)内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
(7)信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
(8)套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
而在java中我们实现多线程间通信则主要采用"共享变量"和"管道流"这两种方法
方法二 通过管道流
其中方法一有两种实现方法,即
方法一a)通过内部类实现线程的共享变量
b)通过实现Runnable接口实现线程的共享变量
方法二(通过管道流):
代码如下:
01 |
public class CommunicateWhitPiping {
|
02 |
public static void main(String[] args) {
|
03 |
/**
|
04 |
* 创建管道输出流
|
05 |
*/
|
06 |
PipedOutputStream pos = new PipedOutputStream();
|
07 |
/**
|
08 |
* 创建管道输入流
|
09 |
*/
|
10 |
PipedInputStream pis = new PipedInputStream();
|
11 |
try {
|
12 |
/**
|
13 |
* 将管道输入流与输出流连接 此过程也可通过重载的构造函数来实现
|
14 |
*/
|
15 |
pos.connect(pis);
|
16 |
} catch (IOException e) {
|
17 |
e.printStackTrace();
|
18 |
}
|
19 |
/**
|
20 |
* 创建生产者线程
|
21 |
*/
|
22 |
Producer p = new Producer(pos);
|
23 |
/**
|
24 |
* 创建消费者线程
|
25 |
*/
|
26 |
Consumer c = new Consumer(pis);
|
27 |
/**
|
28 |
* 启动线程
|
29 |
*/
|
30 |
p.start();
|
31 |
c.start();
|
32 |
}
|
33 |
} |
34 |
35 |
/** |
36 |
* 生产者线程(与一个管道输入流相关联)
|
37 |
*
|
38 |
*/
|
39 |
class Producer extends Thread {
|
40 |
private PipedOutputStream pos;
|
41 |
42 |
public Producer(PipedOutputStream pos) {
|
43 |
this .pos = pos;
|
44 |
}
|
45 |
46 |
public void run() {
|
47 |
int i = 8 ;
|
48 |
try {
|
49 |
pos.write(i);
|
50 |
} catch (IOException e) {
|
51 |
e.printStackTrace();
|
52 |
}
|
53 |
}
|
54 |
} |
55 |
56 |
/** |
57 |
* 消费者线程(与一个管道输入流相关联)
|
58 |
*
|
59 |
*/
|
60 |
class Consumer extends Thread {
|
61 |
private PipedInputStream pis;
|
62 |
63 |
public Consumer(PipedInputStream pis) {
|
64 |
this .pis = pis;
|
65 |
}
|
66 |
67 |
public void run() {
|
68 |
try {
|
69 |
System.out.println(pis.read());
|
70 |
} catch (IOException e) {
|
71 |
e.printStackTrace();
|
72 |
}
|
73 |
}
|
74 |
} |
相关推荐
关于Java线程间通信-回调
使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)
内容概要:Java线程间通信的代码示例 适用人群:Java 使用场景:Java线程间交换数据 目标:通过本资源示例,深刻理解线程间通讯的基本原理和实现方法,解决工作中实际问题。
主要介绍了Java线程间通信不同步问题,结合实例形式分析了java线程间通信不同步问题的原理并模拟实现了线程间通信不同步情况下的异常输出,需要的朋友可以参考下
主要介绍了java线程间通信的通俗解释,介绍了线程通信中的几个相关概念,然后分享了线程通信的实现方式及代码示例,具有一定参考价值 ,需要的朋友可以了解下。
Java的多线程-线程间的通信.doc
下面小编就为大家带来一篇浅谈Java线程间通信之wait/notify。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
java线程间通信 很有用的,可以用于安卓开发以及其他java的开发
主要为大家详细介绍了Java线程间的通信方式,以代码结合文字的方式来讨论线程间的通信,感兴趣的朋友可以参考一下
在char03包里放置了Java线程间通信的知识的代码。内容如下: 等待/通知机制 join方法的使用 在char04包里放置了Java中Lock类的知识的代码,内容如下: Lock类 Lock类其他功能 Condition类 Condition类其他...
Java多线程--线程间的通信
1.线程同步 2.线程间通信 3.线程挂起、恢复和终止 demo演示
java多线程知识点,源代码案例,代码案例中包括如何创建线程,主线程,线程优先级,线程组,线程同步,死锁,线程间的通信知识点
利用线程间的通信主要是因为当多个线程同时对一个对象进行访问的时候,多个线程之间是一个协助的关系,举个例子就是今天要说的生产这和消费者模型。
下面小编就为大家带来一篇深入理解JAVA多线程之线程间的通信方式。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
彻底明白Java的多线程-线程间的通信.doc
结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践 Java多线程无处不在,如服务器、数据库、应用。多线程可以有效提升计算和处理效率,大大提升吞吐量和可伸缩性,...
某些情况下,程序要执行的操作需要满足一定的条件(下文统一将其称...一个线程因其保护条件未满足而被暂停的过程就被称为等待,一个线程使得其他线程的保护条件得以满足的时候唤醒那些被暂停的线程的过程就被称为通知。
主要介绍了Java编程线程间通信与信号量代码示例,具有一定借鉴价值,需要的朋友可以参考下。
生产者如果不释放对临界资源的占用权,那么 消费者就无法消费队列中的商品 ,就不会让队列有空间,那么生产者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产...这种互相通信的过程就是线程间的协作。