Java基础知识9-多线程1

作者: 我相信你爱过gg | 来源:发表于2016-12-25 20:37 被阅读47次
    配图

    什么是多线程

         java对多线程编程提供了内置支持。多线程程序包含同时运行的两个或多个部分。这种程序的每个部分被称为一个线程,每个线程定义了单独的执行路径。因此,多线程是特殊形式的多任务处理。
         多任务处理有两种不同的类型:基于进程的多任务处理和基于线程多多任务处理。

    进程和线程区别

         基于进程的多任务处理就是允许计算机同时运行两个或更多个程序特性。例如,基于进程的多任务处理可以运行java编译器的同时使用文本编辑器或浏览网站。在基于进程的多任务处理中,程序是调度程序能够调度的最小单元。
         基于线程的多任务环境中,最小的可调度代码单元是线程,这意味着单个程序可以同时执行两个或多个任务。例如,在文本编辑器可以在打印的同时格式化文本,只要两个动作是通过两个独立的线程执行即可。

    因此,基于进程的多任务处理“大局”,而基于线程的多任务处理“细节”。

    java线程模型

         java运行时系统在许多方面依赖于线程,并且所有类库在设计时都考虑了多线程。事实上,java通过利用线程使得整个环境能够异步执行。有助于通过防止浪费CPU时钟周期来提高效率。
         通常,在单线程环境中,当线程因为等待某些资源而阻塞(即挂起执行)时,整个程序会停止运行。
         java多线程的优点消除了主循环/论询机制。可以暂停一个线程而不会停止程序的其他部分。也就是说,当java程序中的线程堵塞时,只有被阻塞的线程会停止,所有其他线程仍将继续执行。

    线程的多种形态

         运行(running)状态:只要获得CPU时间就准备运行。运行的线程可以被挂起(suspended),这会临时停止线程的活动。挂起的线程可以被恢复(resumed),从而允许线程从停止处恢复执行。当等待资源时,线程会被阻塞(blocked)。

    在任何时候,都可以终止线程,这会立即停止线程的执行。线程一旦终止,就不可能再恢复。

    线程优先级

         java为每个线程都指定了优先级,优先级决定了相对于其他线程应当如何处理某个线程。线程优先级的一些整数,它们指定了一个线程相对于另一个线程的优先程度。优先级的绝对数值没有意义;如果只有一个线程在运行,优先级高的线程不会比优先级低的线程运行的快。反而,线程的优先级用于决定何时从一个运行的线程切换到下一个,这称为上下文切换。
         决定上下文切换发生时机的规则比较简单:
         1.线程自愿地放弃控制。线程显示地放弃控制权、休眠或在I/O之前堵塞,都会出现这种情况。在这种情况下,检查所有其他线程,并且准备运行的线程中,优先级最高的那个线程会获得CPU资源。
         2.线程被优先级更高的线程取代。对于这种情况,没有放弃控制权的低优先级线程不管在做什么,都会被高优先级线程简单地取代。基本上,只要高优先级线程希望运行,它就会取代低优先级线程,这称为抢占式多任务处理。
         如果具有相同优先级的两个线程竞争CPU资源,这种情况有些复杂。对于windows操作系统,优先级相等的线程以循环方式自动获得CPU资源。对于其他操作系统,优先级相等的线程必须资源的向其他线程放弃控制权,否则其他线程就不能运行。

    注意:操作系统以不同的方式对具有相等优先级的线程进行上下文切换,可以会引起可移植性问题。

    同步

         因为多线程为程序引入了异步行为,所以必须提供一种在需要时强制同步的方法。例如,如果希望两个线程进行通信并共享某个复杂的数据结构。如链表,就需要以某种方式确保它们相互之间不会发生冲突。也就是说,当一个线程正在读取该数据结构时,必须阻止另外一个线程向该数据结构写入数据。

    消息传递

         将程序分隔到独立的线程之后,需要定义它们之间相互通信的方式。当使用某些其他语言编写程序时,必须依赖操作系统建立 线程间相互通信的方式。java为两个或多个线程之间的相互通信提供了一种简洁的低成本方式。java的消息传递系统允许某个线程进入对象的同步方法,然后进行等待,直到其他线程显示的通知这个线程退出为止。

    Thread类和Runnable接口

         java的多线程系统是基于Thread类、Thread类的方法以及伴随接口Runnable而构建的。Thread类封装了线程的执行。因为不能直接引用正在运行的线程的细微状态,所以需要通过代理进行处理,Thread实例就是线程的代理。为了创建新的线程,程序可以扩展Thread类或实现Runnable接口。

    相关文章

      网友评论

        本文标题:Java基础知识9-多线程1

        本文链接:https://www.haomeiwen.com/subject/tocdvttx.html