天天看点

进程中通讯方式(java)

转自:

https://www.cnblogs.com/wust221/p/5414839.html

http://blog.csdn.net/jmppok/article/details/17500739

进程中通讯的8种方式

1.无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

2.高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。

3.有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

4.消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

5.信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

6.信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

7.共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

8.套接字( socket ) : 套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

虽然说是有八种,但其实真正核心的也就只有三种

1)管道

2)共享内存

3)socket

Java中的进程通讯方式

但是呢,java支持的进程间通讯方式,只有socket(万能的socket,准确的说是我只知道这种方式)。是的,java支持多种线程间通讯方式,但是线程和进程是不一样的。

一个java程序是一个进程。比如打开一个MyEclipse,MyEclipse运行程序(JVM)就是一个进程,而我们执行run操作时,就是运行了一个main的主线程。

而进程间通讯方式主要是针对不同主机上的进程通讯,所以用socket就够了。

如果是本机上两个不同进程间通讯,这是和本机系统相关的,最好用C语言等来实现的。想想windows系统就可以直接看到有哪些进程在运行,然后windows系统其实就主要是C语言编写的(当然还有什么汇编语言、C++写的内容等等),所以用C语言实现进程间通讯是很简单的。

当然还看到了一些其他资料上说的java进程间通讯方式,但是看不懂……列出来以供参考:

除了上面提到的Socket之外,当然首选的IPC可以使用Rmi,或者Corba也可以。另外Java nio的MappedByteBuffer也可以通过内存映射文件来实现进程间通信(共享内存)。

java中线程间通讯方式

1、pipe

public class CommunicateWhitPiping {
public static void main(String[] args) {
/**
* 创建管道输出流
*/
PipedOutputStream pos =new PipedOutputStream();
/**
* 创建管道输入流
*/
PipedInputStream pis =new PipedInputStream();
try {
/**
* 将管道输入流与输出流连接 此过程也可通过重载的构造函数来实现
*/
pos.connect(pis);
} catch(IOException e) {
e.printStackTrace();
}
/**
* 创建生产者线程
*/
Producer p = new Producer(pos);
/**
* 创建消费者线程
*/
Consumer c = new Consumer(pis);
/**
* 启动线程
*/
p.start();
c.start();
}
}
/**
* 生产者线程(与一个管道输入流相关联)
*
*/
class Producer extends Thread {
privatePipedOutputStream pos;
public Producer(PipedOutputStream pos) {
this.pos = pos;
}
public void run() {
int i = 8;
try {
pos.write(i);
} catch(IOException e) {
e.printStackTrace();
}
}
}
/**
* 消费者线程(与一个管道输入流相关联)
*
*/
class Consumer extends Thread {
privatePipedInputStream pis;
public Consumer(PipedInputStream pis) {
this.pis = pis;
}
public void run() {
try {
System.out.println(pis.read());
} catch(IOException e) {
e.printStackTrace();
}
}
}
           

2.共享变量(runnable , synchronized、notify、wait)

public class Interfacaesharethread {
public static void main(String[] args) {
Mythread mythread =new Mythread();
new Thread(mythread).start();
new Thread(mythread).start();
new Thread(mythread).start();
new Thread(mythread).start();
}
}
/* 实现Runnable接口 */
class Mythread implements Runnable {
int index = 0;
public synchronized void run() {
while (true)
System.out.println(Thread.currentThread().getName() + "is running and
the index is " + index++);
}
}
/**
* 通过实现Runnable接口实现线程的共享变量
*/
public class Interfacaesharethread {
public static void main(String[] args) {
Mythread mythread = new Mythread();
new Thread(mythread).start();
new Thread(mythread).start();
new Thread(mythread).start();
new Thread(mythread).start();
}
}
/* 实现Runnable接口 */
class Mythread implements Runnable {
int index = 0;
public synchronized void run() {
while (true)
System.out.println(Thread.currentThread().getName() + "is running and
the index is " + index++);
}
}
           

还有一种是内部类,就列举了。

还有一些其他的方法,详情见:

https://blog.csdn.net/u011514810/article/details/77131296