进程间通信的方法主要有以下几种:
(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线程间通信中起到桥梁的作用,使得线程能够以非阻塞的方式互相协作,提高了程序的并发性能和响应速度。理解并熟练掌握回调以及其他线程通信机制是Java并发编程的关键,这对于开发高效、稳定的多...
Java线程间通信是多线程编程中的一个重要概念,它涉及到如何在并发执行的线程之间有效地传递信息和协调工作。在Java中,线程间通信主要通过共享内存(如共享变量)和消息传递(如wait(), notify(), notifyAll()等...
使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)
Java线程间通信主要包括线程间的同步和线程间的协作两部分。常用的通信方法有`wait()`、`notify()`和`notifyAll()`等。 1. **wait()**:使当前线程暂停执行,并释放当前持有的锁。 2. **notify()**:唤醒正在等待该...
Java线程间通信是多线程编程中的重要概念,它涉及到如何在多个并发执行的线程之间有效地共享数据。在Java中,线程间的通信主要目的是解决资源共享时可能出现的竞态条件、死锁等问题,确保数据的一致性和完整性。本文...
Java线程间通信之wait/notify Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式。 wait()方法将当前线程置于等待...
在"JAVA100例之实例64 JAVA线程间通讯"这个主题中,我们将深入探讨Java中实现线程间通信的几种主要方法。 1. **共享数据**:最直观的线程间通信方式是通过共享内存空间,即共享变量。只要对共享变量的操作是线程...
在Java多线程编程中,线程间的通信是非常重要的概念,用于协调多个并发执行的任务。线程的状态转换是理解线程通信的基础,主要包括四个状态:新(New)、可执行(Runnable)、死亡(Dead)和停滞(Blocked)。新状态...
3. **wait(), notify(), notifyAll() 方法**:这些方法是Object类的成员,用于线程间通信。在线程A调用`wait()`后,它会被放入等待池,释放锁并暂停执行,直到其他线程调用同一对象的`notify()`或`notifyAll()`唤醒...
在char03包里放置了Java线程间通信的知识的代码。内容如下: 等待/通知机制 join方法的使用 在char04包里放置了Java中Lock类的知识的代码,内容如下: Lock类 Lock类其他功能 Condition类 Condition类其他...
Java线程间的通信是多线程编程中的重要概念,它涉及到如何协调多个并发执行的线程,确保数据的一致性和正确性。本文将详细介绍两种常见的Java线程通信方式:同步和while轮询。 1. 同步(Synchronized) 同步是Java...
在Java并发编程中,线程间通信协作是一个关键的概念,特别是在多线程环境中,如生产者-消费者模型。这个模型中,生产者线程负责生产数据并放入队列,而消费者线程则负责取出并消费这些数据。为了保证数据的安全和...
### Android线程间通信详解 #### 一、引言 Android应用程序通常运行在单个主线程上,称为“主线程”或“UI线程”。为了提高应用性能和用户体验,开发者经常需要利用多线程技术来执行后台任务,比如下载图片、获取...
Java提供了多种线程间通信的手段,如`BlockingQueue`、`Future`、`ExecutorService`等。其中,`wait()`, `notify()`, `notifyAll()`是基于对象监视器的通信方式,用于在线程间传递信号。`BlockingQueue`则提供了...
除了上述两种方式,Java还提供了其他线程间通信的方法: 3. Wait/Notify机制: `wait()`, `notify()`, `notifyAll()`是Object类提供的方法,用于线程间通信。在线程A执行完特定操作后,可以调用`notify()`或`...
2. **线程间通信**: 在多线程环境中,线程之间可能需要交换数据或协调工作。Java提供了一些机制,如`wait()`、`notify()`和`notifyAll()`方法,这些方法存在于`Object`类中,用于线程间的通信。在`Q.java`的`get()...
本节将深入探讨Java线程间通信、Java类加载器以及JVM内存模型这三个核心知识点。 首先,我们来讨论Java线程间通信。在多线程环境下,线程间通信是确保程序正确执行的关键。Java提供了多种机制来实现这一目标,如...
Java多线程编程中的线程间通信是解决并发问题的关键技术之一。在多线程环境中,线程间的协作和同步往往需要依赖于等待与通知机制,以确保在正确的时间执行正确的操作,避免资源的竞争和死锁。等待与通知是Java中实现...