基本概念
1. 进程的基本概念
线程(thread)是进程(processes)中某个单一顺序的控制流,也被称为轻量进程(lightweight processes)。
进程是表示资源分配的基本单位,又是调度运行的基本单位。 例如: 用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。 然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。 所以,进程是系统中的并发执行的单位。
2. 线程的基本概念
在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。 在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。 线程是进程中执行运算的最小单位,也就是执行处理机调度的基本单位。 如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。
例如: 假设用户启动了一个窗口中的数据库应用程序,操作系统就将对数据库的调用表示为一个进程。 假设用户要从数据库中产生一份工资单报表,并传到一个文件中,这是一个子任务; 在产生工资单报表的过程中,用户又可以输人数据库查询请求,这又是一个子任务。 这样,操作系统则把每一个请求――工资单报表和新输人的数据查询表示为数据库进程中的独立的线程。 线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进行。 操作系统提供线程就是为了方便而有效地实现这种并发性
引入线程的好处 1. 易于调度。 2. 提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。 3. 开销少。创建线程比创建进程要快,所需开销很少。。 4. 利于充分发挥多处理器的功能。通过创建多线程进程,每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。
3. 线程的基本状态
就绪:调用线程的start方法后线程进入就绪状态
阻塞:线程调度系统将就绪状态的线程转为运行状态
运行:遇到synchronized语句时,由运行状态转为阻塞
结束:当线程关联的代码执行完后,线程变为结束状态
4. 线程与进程的区别
线程与进程的区别可以归纳为以下4点: 1)地址空间:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
2)通信方式:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信。需要进程同步和互斥手段的辅助,以保证数据的一致性。
3)调度切换:线程上下文切换比进程上下文切换要快得多。
4)二者均可并发执行,在多线程OS中,进程不是一个可执行的实体。
简而言之,一个程序至少有一个进程,一个进程至少有一个线程。 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。 但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。 但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈), 但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。
5. 多线程有几种实现方法
多线程有两种实现方法。一种是继承Thread类,一种是实现Runnable接口。
同步有两种方法。一种同步方法,一种同步代码。分别是synchronized,wait与notify
6. 多线程同步和互斥异同
线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。 线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。 当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用, 其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步。