线程基础学习

   

    一、线程与进程的关系  

     一个应用程序可以存在多个进程实例,而一个进程实列内部又可以同时包含多个线程. 从理论上讲,线程是进程内的单个执行单元,它是Windows操作系统为CPU工作分配的一个最小单位.      线程主要由数据结构、堆栈和CPU寄存器组成.每一个线程都可以在它的进程中单独运行,并 保存自已的堆栈和寄存器的值。     线程的工作原理主要根据CPU的运行机制所决定的.当多个应用程序实例同时运行时.操作系统会为 每一个应用程序的实列,也就是一个进程分配虚拟空间和系统资源,并且CPU会按照程序的优先级为每一 个程序分配一个时间段,然后进程在自已的时间段内再为每一个纯生分配时间片, 这样线程玉会在指定的时间 内工作. 如果进程或线程在指定的时间内没有完成它的工作,则CPU就会为这个进程分配下一轮的时间段.    所谓多线程并不是指所有线程同时工作,而是由于分配给线程的时间太少,从感觉上好像是同时运行, 如果一台电脑有两个CPU,就可以真正实现多个线程同时工作.   每一个应用程序的实列都必须存在一个线程,这个线程称为应用程序的主线程.      何时使用多线程    虽然多线程可以使应用程序具有较高的性能,但也不能盲目的为应用程序添加线程.这样不但不会优化程序,  反而会影响程序的运行效率.由于线程会将单个问题分解,如果是一个复杂的问题利用多个程序来解决自然是好 ,但是一个简单的问题也利用多线程就等于是将一个简单的问题复杂化, 增加系统的开销.

对于多线程的使用,大致分为以下几种情况.

 (1)一处程序存在多个任务,这些任务可以同时执行,互不影响

 (2)在应用程序运行时某个任务非常耗时,可以放到后台动行.  

 (3)应用程序的某个响应事件中的算法过于复杂,例如,应用程序在某个按钮的单击事件中执行一个操作,如果该操作过于复杂  ,

     就会导致应用程序处于停顿状态,并出现程序未响应的    情况,这时另外开一个线程,就不会出现这种现象

 (4)对硬件设备的开发  

 (5)对图形设备的开发  

 (6)对游戏软件的开发

 (7)对数据库的操作  

 二、线程的调度   

   线程的调度主要是为线程分配合理的CPU运行时间,从而有效地完成线程的操作.根据调度的方式.可将线程调度分为   

   1.非抢先式调度  

     非抢先式调度调度是指当调度为一个线程指定了时间片后,其他线程就不能再分配时间片,只有当这个线程用完CPU分配 分配给它的时间片后,调度才会为其他的线程分配时间片.例如,操作系统同时运行两个程序,一个程序为简单的程序, 另一个 程序为较复杂的程序.CPU首先为较复杂的程序分配的时间片,只要当较复杂的程序运行完才运行简单的程序,这样就影响了程 序的运行效果.   

  2.抢先式调度

      在一般的情况下,当线程用完CPU为它分配的时间片后,线程会将CPU的控制权交还给调度程序,此时调度程序会重新为所有 线程重新分配时间片,但线程满足以下条件时,调度会收回CPU控制权,为其它线程分配时间片  

    (1)当正在运行的线程由于某种原因处于阻塞状态   

    (2)当正在运行的线程调用了Sleep方法   

    (3)当某一未运行的线程的优先级比当前运行的线程优先级高时         

原文地址:https://www.cnblogs.com/pengshaomin/p/2339286.html