面试day3

#JAVA进程间的通信方式(IPC)

JAVA进程间通信的方法主要有以下几种:

  1. 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。   
  2. 命名管道(named pipe):命名管道克服了管道没有名字的限制,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。   
  3. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送 信号给进程本身。   
  4. 消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。   
  5. 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。   
  6. 内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。   
  7. 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。   
  8. 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。

#Java线程间的通信方式

###锁
synchronized、notify、wait

1
2
3
4
5
synchronized (threadToGo) {
while(条件) threadToGo.wait();
do something
threadToGo.notify();
}

Lock和Condition

1
2
3
4
5
6
7
8
9
private Lock lock = new ReentrantLock(true);
private Condition condition = lock.newCondition();


lock.lock();
while(threadToGo.value == 2)
condition.await();
do something
condition.signal();

volatile

1
2
3
4
private volatile ThreadToGo threadToGo = new ThreadToGo();
while(threadToGo.value==2){}
Helper.print(arr[i], arr[i + 1]);
threadToGo.value=2;

AtomicInteger

1
2
3
while(threadToGo.get()==2){}
Helper.print(arr[i], arr[i + 1]);
threadToGo.set(2);

PipedInputStreamAPI通道

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private final PipedInputStream inputStream1;
private final PipedOutputStream outputStream1;
private final PipedInputStream inputStream2;
private final PipedOutputStream outputStream2;
private final byte[] MSG;
public MethodSix() {
inputStream1 = new PipedInputStream();
outputStream1 = new PipedOutputStream();
inputStream2 = new PipedInputStream();
outputStream2 = new PipedOutputStream();
MSG = "Go".getBytes();
try {
inputStream1.connect(outputStream2);
inputStream2.connect(outputStream1);
} catch (IOException e) {
e.printStackTrace();
}
}
public void shutdown() throws IOException {
inputStream1.close();
inputStream2.close();
outputStream1.close();
outputStream2.close();
}