一、进程通信
(1)管道
a)、无名管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系;
b)、高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式;
c)、有名管道(named pipe):有名管道也是半双工的通信方式,克服了管道没有名字的限制,同时是它允许无亲缘关系进程间的通信;
(2)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送 信号给进程本身;Linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该 函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
(3)信号量(Semaphore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段;
(4)消息队列(Message queue): 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点;
(5)共享内存(Shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信;
(6)套接字(Socket):套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字;
二、线程通信
(1)共享内存,同上面所述。这里通过内部类实现线程的共享变量
-
- public class Innersharethread {
- public static void main(String[] args) {
- Mythread mythread = new Mythread();
- mythread.getThread().start();
- mythread.getThread().start();
- mythread.getThread().start();
- mythread.getThread().start();
- }
- }
- class Mythread {
- int index = 0;
-
- private class InnerThread extends Thread {
- public synchronized void run() {
- while (true) {
- System.out.println(Thread.currentThread().getName()
- + "is running and index is " + index++);
- }
- }
- }
-
- public Thread getThread() {
- return new InnerThread();
- }
- }
(2)管道。首先建立管道流,并将管道流的输入输出对象进行链接;将管道流加入到生产对象(线程)中;通过管道流引出输入输出流,并在线程中对这些流进行操作;注:管道流的的read的方法是一种阻塞方法;
- 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 {
- private PipedOutputStream 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 {
- private PipedInputStream pis;
-
- public Consumer(PipedInputStream pis) {
- this.pis = pis;
- }
-
- public void run() {
- try {
- System.out.println(pis.read());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
(3)调用公共接口,还有如Scala语言中的Actor机制等等