并发

      多线程是Java中的并发机制,表示能够再同一时间内同时执行多个操作。在日常生活中,边上网边听歌就是一个多线程。用并发解决的问题大体上可以分为“速度”和“设计可管理性”两种。

      速度问题初听起来很简单,如果你想要一个程序运行的更快,那么可以将其断开为多个片段,再单独的处理器上运行每个片段。并发是用于多处理器编程的基本工具。但是,并发通常是提高运行在单处理器尚的程序的性能。这听起来有点违背直觉。如果你仔细的考虑下就会发现,在单处理器上运行的并发程序开销确实应该比该程序的所有部分都顺序执行的开销大,因为其中增加了所谓的上下文切换的代价(从一个任务切换到另一个任务)。表面上看,将程序的所有部分当作单个任务运行好像是开销更小一点,并且可以节省上下文切换的代价。

      使这个问题变得有些不同的是阻塞。如果程序中的某个任务因为该程序控制范围之外的某些条件(通常是IO)而导致不能继续执行,那么我们就说这个任务或线程阻塞了。如果没有并发,则整个程序都将停止下来,直至外部条件发生变化。但是,如果使用并发来编写程序,那么当一个任务阻塞时,程序中的其他任务还可以继续运行,因此这个程序可以保持继续向前执行。事实上,从性能的角度看,如果没有任务阻塞,那么在单处理器机器上使用并发就没有任何意义。

      实现并发最直接的方式时在操作系统级别使用进程。进程时运行在它自己的地址空间内的自包容的程序。多任务操作系统可以通过周期性地将CPU从一个进程切换到另一个进程,来实现同时运行多个进程(程序),尽管这使得每个进程看起来在其执行过程中都是歇歇停停。进程总是很吸引人,因为操作系统通常会将进程相互隔离开,因此它们不会相互干涉,这使得用进程编程相对要简单一些。与此相反的是,像Java所使用的这种并发系统会共享诸如内存和IO这样的资源,因此编写多线程程序最基本的困难在于协调不同线程驱动的任务之间对这些资源的使用,以使得这些资源不会同时被多个任务访问。

      java是在顺序型语言的基础上提供对线程得支持。与在多任务操作系统中分叉外部进程不同,线程机制是在由执行程序表示的单一进程中创建任务。这种方式产生的一个好处是操作系统的透明性,这对java而言,是一个重要的设计目标。在单CPU机器上使用多任务的程序在任意时刻任旧只是在执行一项工作,因此从理论上讲,肯定可以不用任何任务而编写出相同的程序。但是,并发提供了一个重要的组织结构上的好处:你的程序设计可以极大地简化。某些类型的问题,例如仿真,没有并发的支持是很难解决的。

     基本的线程机制使我们可以将程序划分为多个分离的,独立运行的任务。通过使用多线程机制,这些独立任务(也被称为子任务)中的每一个都将由执行线程来驱动。一个线程就是在进程中的一个单一的顺序控制流,因此,单个进程可以拥有多个并发执行的任务,但是你的程序使得每个任务都好像有其自己的CPU一样。其底层机制是切分CPU时间,但通常我们不需要考虑它。

     线程模型为编程带来了便利,他简化了在单一程序中同时交织在一起的多个操作的处理。在使用线程时,CPU将轮流给每个任务分配其占用的时间。每个任务都觉得自己在一直占用CPU,但事实上CPU时间是划分成片段分配给所有的任务。线程的一大好处是可以使你从这个层次抽身出来,即代码不必知道它是运行在具有一个还是多个CPU的机器上。所以,使用线程机制是一种建立透明的,可扩展的程序的方法,如果程序运行得太慢,为机器增添一个CPU就能很容易地加快程序地运行速度。多任务和多线程往往是使用多处理器系统地最合适方式。

      线程可以驱动任务,因此你需要一种描述任务的方式,这可以由Runnable接口来提供。要想定义任务,只需实现Runnable接口并编写run()方法,使得该任务可以执行你的命令。

    

 

     

     

posted @ 2016-11-13 15:22  Warekiller  阅读(160)  评论(0编辑  收藏  举报