一、进程和线程的区别
1,进程和线程都有三种基本状态:就绪,运行,阻塞
2,从资源的角度讲:进程是拥有资源的基本单位,线程可以共享其隶属进程的系统资源。
3,从调度的角度讲:线程是cpu调度的基本单位。
4,从系统开销的角度讲:进程由程序、数据、进程控制块三部分组成。每次创建进程,系统都要为之分配或回收资源,如内存、io等。
线程由线程ID、当前指令指针、寄存器集合和堆栈等组成,线程切换只需要保存和设置少量寄存器变量,因此系统开销小。
5,从通信方面:进程通信需要依靠操作系统,而线程可以直接读写进程数据段(全局变量)来进行通信。
进程通信可以采用的方法有:管道、信号、信号量、消息队列、共享内存、状态变量、套接字(socket)<不同机器之间>
线程通信貌似也有类似的一些东西
二、java中多线程的实现方式
1,线程创建
1.1继承Thread
1)定义Thread的子类,实现run()方法
2)创建Thread子类的对象 [创建之后,线程处于新建状态]
3)调用线程对象的start方法 [线程处于就绪状态]
1.2实现runnable或者callable
1)定义类,实现runnable接口,重写run方法
2)创建上述类类的对象 [创建之后,线程处于新建状态]
3)不直接调用上述对象的start方法,而是将其作为target。new Thread(对象).start() [线程处于就绪状态]
2,控制线程的相关方法
1)join 让一个线程等待另一个线程完成。调用后,当前线程阻塞,直到被调用的线程执行结束。
2)sleep让线程休眠,由运行态进入阻塞态。
3)yield让线程重新调度,有运行态进入就绪态。
3,线程同步
1)同步代码块,利用Synhronized(obj){}修饰一段代码
2)同步方法,将方法使用Synhronized修饰
3)同步锁Lock,和同步方法比较类似,只是同步锁显示使用Lock对象作为同步锁
4,线程通信
1)全局变量
2)使用Object类的三个方法:该方法有同步监视器对象调用
wait:导致当前进程等待
notify:唤醒在该同步监视器上等待的进程(随机选一)
notifyAll:唤醒在该同步监视器上等待的所有进程