进程是系统进行资源配置和调度的基本单位,是操作系统结构的基础。
一个标准的线程由线程id、指令指针(PC)、寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己不拥有系统资源,与其他同属于同一个进程的线程共享进程所拥有的全部资源。
基于进程的多任务特点:
- 每个进程在执行时,都有独立的内存空间。
- 进程又称重量级进程。
- 各进程间的信息传递是昂贵的。
- 从一个进程切换到另一个进程需要分别保留和下载缓存器、内存映像、更新串行等。
基于线程的多任务特点:
- 由于各线程间是独立的,所以可以同时完成多个工作。
- 因为可以同时完成多个工作,所以执行效率比较高。
- 由于各线程间是独立的,如果单个线程发生异常不会影响其他线程工作。
- 线程间由于是共享内存空间,线程间工作切换与通信成本很低。
守护进程:
守护进程是一种存在后台为一般线程提供服务的线程,例如,垃圾回收线程就是一种守护线程。
设计一个线程为守护线程时,主线程若是想要结束执行会检查剩下线程的属性。
(1)、如果此时剩下线程的Daemon属性是true,表示Daemon线程仍在执行,其他非Daemon线程执行结束,程序将不等待Daemon线程,也会自行结束,同时终止此Daemon线程工作。
(2)、如果此时剩下线程的Daemon属性是false,主线程会等待线程结束,再结束工作。
**
Java的同步
防止线程彼此干扰。
防止不一致的问题。
- 线程同步
线程同步又可分为相互排斥和线程间的通信。
相互排斥又可分为以下三类:
- 同步方法:
同步方法就是再方法名称前面加上synchronized关键词。同步方法最重要的是可以锁住共享的资源,也就是任何一个线程调用同步方法时,可以自动锁住共享资源,直到这个线程完成工作才会将共享资源释出。
- 同步区块:
将需要做同步的程序代码放在同步区块内。
- 同步静态方法:
如果将同步应用于静态方法,那么被锁住的资源是类,而不是对象,由于类被锁住了,所以也可以达到同步的效果。
设计同步静态方法非常容易,只要再静态方法前面加上synchronized即可。
死锁:
最常见于 A线程拥有资源a需要资源b,但资源b被B线程锁住,同时B线程拥有资源b需要资源a,而资源a被A线程锁住。
2. 线程内部通信
线程的内部通信机制主要是可以让一个线程再关键时刻先暂停,让另一个线程进入先运行。这时候需要使用wait()、notify()、notifyAll()方法。
**wait()方法:**可以让目前线程释放锁,同时等待其他线程通知notify()或notifyAll(),或是等待时间终了。
**notify()方法:**唤醒等待的线程。
**notifyAll()方法:**将所有等待的线程唤醒。