`
riyunzhu
  • 浏览: 30235 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

线程的概念

 
阅读更多

说到线程的概念,我们不得不提进程。那我们先看什么叫进程?

一、进程的概念

进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。简单的说,当我们启动一个应用程序,就会有个进程。可以通过任务管理器查看到当前系统的进程有哪些。系统给进程分配了独立的内存空间

二、线程(Tread)

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。

每一个程序都至少有一个线程,那就是程序本身。线程是程序中一个单一的顺序控制流程。 在单个程序中同时运行多个线程完成不同的工作,称为多线程。

三、线程的状态

  1. 新建状态(new)
  2. 就绪状态(Runnable)
  3. 运行状态(Running)
  4. 阻塞状态(Blocked)
  5. 死亡状态(Dead)

四、线程给我们带来的好处

如果能合理地使用线程,将会减少开发和维护成本,甚至可以改善复杂应用程序的性能。如在GUI应用程序中,还以通过线程的异步特性来更好地处理事件;在应用服务器程序中可以通过建立多个线程来处理客户端的请求。线程甚至还可以简化虚拟机的实现,如Java虚拟机(JVM)的垃圾回收器(garbage collector)通常运行在一个或多个线程中。因此,使用线程将会从以下五个方面来改善我们的应用程序:

1. 充分利用CPU资源

现在世界上大多数计算机只有一块CPU.因此,充分利用CPU资源显得尤为重要。当执行单线程程序时,由于在程序发生阻塞时CPU可能会处于空闲状态。这将造成大量的计算资源的浪费。而在程序中使用多线程可以在某一个线程处于休眠或阻塞时,而CPU又恰好处于空闲状态时来运行其他的线程。这样CPU就很难有空闲的时候。因此,CPU资源就得到了充分地利用。

2.简化编程模型

如果程序只完成一项任务,那只要写一个单线程的程序,并且按着执行这个任务的步骤编写代码即可。但要完成多项任务,如果还使用单线程的话,那就得在在程序中判断每项任务是否应该执行以及什么时候执行。如显示一个时钟的时、分、秒三个指针。使用单线程就得在循环中逐一判断这三个指针的转动时间和角度。如果使用三个线程分另来处理这三个指针的显示,那么对于每个线程来说就是指行一个单独的任务。这样有助于开发人员对程序的理解和维护。

3.简化异步事件的处理

当一个服务器应用程序在接收不同的客户端连接时最简单地处理方法就是为每一个客户端连接建立一个线程。然后监听线程仍然负责监听来自客户端的请求。如果这种应用程序采用单线程来处理,当监听线程接收到一个客户端请求后,开始读取客户端发来的数据,在读完数据后,read方法处于阻塞状态,也就是说,这个线程将无法再监听客户端请求了。而要想在单线程中处理多个客户端请求,就必须使用非阻塞的Socket连接和异步I/O.但使用异步I/O方式比使用同步I/O更难以控制,也更容易出错。因此,使用多线程和同步I/O可以更容易地处理类似于多请求的异步事件。

4. 使GUI更有效率

使用单线程来处理GUI事件时,必须使用循环来对随时可能发生的GUI事件进行扫描,在循环内部除了扫描GUI事件外,还得来执行其他的程序代码。如果这些代码太长,那么GUI事件就会被“冻结”,直到这些代码被执行完为止。

在现代的GUI框架(如SWING、AWT和SWT)中都使用了一个单独的事件分派线程(event dispatch thread,EDT)来对GUI事件进行扫描。当我们按下一个按钮时,按钮的单击事件函数会在这个事件分派线程中被调用。由于EDT的任务只是对GUI事件进行扫描,因此,这种方式对事件的反映是非常快的。

5.节约成本

提高程序的执行效率一般有三种方法:

(1)增加计算机的CPU个数。

(2)为一个程序启动多个进程

(3)在程序中使用多进程。

第一种方法是最容易做到的,但同时也是最昂贵的。这种方法不需要修改程序,从理论上说,任何程序都可以使用这种方法来提高执行效率。第二种方法虽然不用购买新的硬件,但这种方式不容易共享数据,如果这个程序要完成的任务需要必须要共享数据的话,这种方式就不太方便,而且启动多个线程会消耗大量的系统资源。第三种方法恰好弥补了第一种方法的缺点,而又继承了它们的优点。也就是说,既不需要购买CPU,也不会因为启太多的线程而占用大量的系统资源(在默认情况下,一个线程所占的内存空间要远比一个进程所占的内存空间小得多),并且多线程可以模拟多块CPU的运行方式,因此,使用多线程是提高程序执行效率的最廉价的方式。

五、多线程

对于多线程的好处这就不多说了。但是,它同样也带来了某些新的麻烦。只要在设计程序时特别小心留意,克服这些麻烦并不算太困难。

(1)同步线程

许多线程在执行中必须考虑与其他线程之间共享数据或协调执行状态。这就 需要同步机制。在Java中每个对象都有一把锁与之对应。但Java不提供单独的lock和unlock操作。它由高层的结构隐式实现, 来保证操作的对应。(然而,我们注意到Java虚拟机提供单独的monito renter和monitorexit指令来实现lock和unlock操作。)

synchronized语句计算一个对象引用,试图对该对象完成锁操作, 并且在完成锁操作前停止处理。当锁操作完成synchronized语句体得到执行。当语句体执行完毕(无论正常或异常),解锁操作自动完成。作为面向对象的语言,synchronized经常与方法连用。一种比较好的办法是,如果某个变量由一个线程赋值并由别的线程引用或赋值,那么所有对该变量的访问都必须在某个synchromized语句或synchronized方法内。

现在假设一种情况:线程1与线程2都要访问某个数据区,并且要求线程1的访问先于线程2, 则这时仅用synchronized是不能解决问题的。这在Unix或Windows NT中可用Simaphore来实现。而Java并不提供。在Java中提供的是wait()和notify()机制。使用如下:

synchronized method-1(…){ call by thread 1. 
∥access data area; 
available=true; 
notify() 
} 
synchronized method-2(…){∥call by thread 2. 
while(!available) 
try{ 
wait();∥wait for notify(). 
}catch (Interrupted Exception e){ 
} 
∥access data area 
} 

其中available是类成员变量,置初值为false。如果在method-2中检查available为假,则调用wait()。wait()的作用是使线程2进入非运行态,并且解锁。在这种情况下,method-1可以被线程1调用。当执行 notify()后。线程2由非运行态转变为可运行态。当method-1调用返回后。线程2 可重新对该对象加锁,加锁成功后执行wait()返回后的指令。这种机制也能适用于 其他更复杂的情况。

(2)死锁

如果程序中有几个竞争资源的并发线程,那么保证均衡是很重要的。系统均衡是指每个线程在执行过程中都能充分访问有限的资源。系统中没有饿死和死锁的线程。Java并不提供对死锁的检测机制。对大多数的Java程序员来说防止死锁是一种较好的选择。最简单的防止死锁的方法是对竞争的资源引入序号,如果一个线程需要几个资源,那么它必须先得到小序号的资源,再申请大序号的资源。

部分转载自:http://java.chinaitlab.com/line/779230_2.html

分享到:
评论

相关推荐

    操作系统原理线程概念与应用 操作系统原理线程概念与应用

    本文将深入探讨操作系统原理中的线程概念及其应用。 线程的概念: 线程是进程中的一个执行路径,每个线程都有自己的程序计数器、寄存器集合以及栈空间,但它们共享同一块内存空间,包括全局变量、静态变量等。这种...

    78-教学课件-线程概念1

    【线程概念1】教学课件主要探讨了线程的基础知识、多线程模型和线程库,这些都是软件开发中的重要概念,特别是对于理解和优化并发性能至关重要。 首先,线程被定义为进程内的一个执行单元,是可调度实体。在没有...

    C#多线程概念及举例介绍

    ### C#多线程概念及举例介绍 #### 一、多线程概念 在计算机科学领域,多线程是指在单个程序中可以同时运行多个不同的线程来执行不同的任务。这种方式可以更好地利用CPU资源,提高程序的执行效率。线程是操作系统...

    操作系统-4.1-线程概念1

    操作系统中的线程概念是计算机系统执行程序的基本单元,它代表了程序的一次执行流程。在多线程环境中,一个进程可以包含多个同时运行的线程,这些线程共享同一内存空间,相互之间可以直接通信,从而提高了系统资源的...

    进程、线程概念回顾1

    而进程控制块、进程状态、线程概念、进程互斥和同步等机制,则构成了实现并发的硬件和软件基础。理解和掌握这些概念,对于设计和优化操作系统以及开发高效的应用程序来说,都是不可或缺的。在多核处理器和云计算时代...

    Java多线程概念及应用详细解析

    Java多线程概念及应用详细解析.mht,I love java

    java 多线程内容 1. 线程概念 2. 线程的创建和停止 3. 线程的状态

    java 多线程内容 1. 线程概念 2. 线程的创建和停止 3. 线程的状态

    多线程服务器端的实现1 —— 线程概念1

    在IT领域,尤其是在服务器开发中,理解多线程的概念至关重要,因为这直接影响到服务器的性能和并发处理能力。本文将详细探讨线程在服务器端实现中的作用,以及它相对于多进程模型的优势。 首先,随着Web服务器的...

    Java多线程完全概念题

    以上只是Java多线程概念题的一部分,理解并熟练运用这些概念对于编写高效、稳定的并发程序至关重要。在实际开发中,还需要考虑线程安全、死锁、活锁、饥饿等问题,并合理利用线程池(ThreadPoolExecutor)优化线程...

    Java线程概念与原理.pdf

    本文将深入探讨Java线程的概念、原理以及如何在Java中创建和启动线程。 首先,我们需要理解操作系统中的线程和进程。线程是进程中的执行单元,每个进程都有一片独立的内存空间,而线程则共享进程的内存。在多线程...

    Java线程详解(线程概念、代码示例、周期解析等)

    Java线程是编程中一个非常重要的概念,尤其在多任务并行处理的环境中。线程是程序中的一个单一顺序控制流,它在一个进程中执行特定的功能。与进程不同,线程共享同一块内存空间和系统资源,这使得线程间的通信更为...

    进程与线程的生动形象理解

    进程与线程作为操作系统中的核心概念,对于理解和开发高效的软件至关重要。本文旨在通过一个生动的类比来帮助读者更好地理解进程与线程的基本概念及其差异,并进一步探讨它们在实际应用中的联系与区别。 #### 二、...

    c#多线程的奥妙,多线程的概念STAThread教程+源代码,非常好的.

    本教程将深入探讨C#中的多线程概念以及STAThread特性,并提供相关的源代码示例,帮助你更好地理解和应用这一技术。 首先,我们来理解什么是多线程。在单线程程序中,任务是按顺序执行的,而多线程则允许多个任务...

    进程与线程概念

    oooooooooooooooooooooooooooooooooooooooooooooooooooo

    delphi7 多线程测试(40个线程)

    以下是一些关键的多线程概念和技巧: - **线程优先级**:调整线程优先级可以帮助平衡系统资源,但过度依赖优先级可能导致优先级反转和死锁,应谨慎使用。 - **线程池**:使用线程池可以重用已创建的线程,减少创建...

    12.1 Qt5多线程:多线程及简单实例

    多线程概念** 多线程是指在一个进程中同时执行多个独立的代码段,每个代码段称为线程。这种并行处理可以提高程序的执行效率,尤其是在处理I/O密集型或计算密集型任务时,可以显著提升用户体验。 **2. Qt5中的线程*...

    Linux系统下的多线程编程入门.pdf

    本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程概念 多线程是指在一个进程中可以同时执行多个独立的代码段,每个代码...

    MFC 多线程应用, 包括工作线程, 用户界面线程

    1. **多线程概念**:多线程是指一个进程中可以有多个并发执行的线程。每个线程都有自己的执行上下文,包括程序计数器、栈和局部变量。多线程可以在CPU空闲时切换执行,提高资源利用率,但同时也带来了线程同步、竞态...

Global site tag (gtag.js) - Google Analytics