进程和线程的区别:
(1) 进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元。
(2) 同一个进程中可以包括多个线程,并且线程共享整个进程的资源,一个进程至少包括一个线程。
(3) 进程结束后她拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束。
(4) 线程是轻量级进程,它的创建和销毁所需要的时间比进程小很多。
(5) 线程中执行一般都要进行同步和互斥,因为他们共享同一进程的所有资源。
(6) 线程有自己的私有属性TCB,线程id,寄存器等,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志。
进程间通信的方式
(1) 共享存储区通信
为了传输大量的数据,在内存中划出了一块共享存储区域,各个进程可通过对该共享区的读或写交换信息,实现通信。这种通信方式属于高级通信,需要通信的进程在通信前,先向系统中申请获得共享内存区中的一个分区,并将其附加到自己的地址空间中,以便对其中的数据进行正常读、写,读写完成或不再需要时,将其归还共享存储区。
(2) 管道通信
所谓“管道”,是指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程)以字符流形式将大量的数据送入管道;而接受管道输出的接收进程(即读进程)则从管道中接收(读)数据。由于发送进程和接收进程是利用管道进行通信的,故又称管道通信。
(3) 消息队列
以格式化的消息(message)为单位,将通信的数据封装在消息中,并利用操作系统提供的一组通信命令(原语),在进程间进行消息传递,完成进程间的数据交换。
(4) 信号量
本身不具有数据交换的功能,是通过控制其他通信资源(文件、外部设备)来实现进程间通信,本身是一种外部资源的标识。在此过程中负责数据操作的互斥与同步功能。
(5) socket通信
比如TCP,其实是两台主机上的进程在通信,通过socket实现的。
线程间通信的方式
(1) 共享变量
多个线程共同一个全局变量,以此实现线程间通信。
(2) 管道
使用java.io.PipedInputStream和java.io.PipedOutputStream进行通信。
这种更像是消息传递机制,就是通过管道,将一个线程中的消息发送给另一个线程。
(3) wait/notify
通过调用wait和notify方法进行线程间通信,以实现通知线程的状态发生改变。
(4) 锁机制
使用synchronized和Lock锁实现线程间通信,当对一个对象或代码块加上锁以后,也就通知了想要进入此代码块的其他的线程要进入阻塞状态。
参考:https://blog.youkuaiyun.com/zhou753099943/article/details/51771220