zoukankan      html  css  js  c++  java
  • Java 多线程(一) 基础知识与概念

    多线程Multi-Thread 基础

     

    线程概念

      线程就是程序中单独顺序的流控制。

      线程本身不能运行,它只能用于程序中。

      说明:线程是程序内的顺序控制流,只能使用分配给程序的资源和环境。

     

    进程

      进程:执行中的程序。

      程序是静态的概念,进程是动态的概念。

      一个进程可以包含一个或多个线程。

      一个进程至少要包含一个线程。

     

    线程与进程的区别

      多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响。

      线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换负担比进程切换的负担要小

      多线程程序比多进程程序需要更少的管理费用。

      进程是重量级的任务,需要分配给它们独立的地址空间,进程间通信是昂贵和受限的,进程间的转换也是很需要花费的。

      另一方面,线程是轻量级的选手,它们共享相同的地址空间并且共同分享同一个进程,线程间的通信是便宜的,线程间的转换也是低成本的。

     

    单线程

      单个程序中只有一个线程就是单线程。  

      当程序启动运行时,就自动产生一个线程,主方法main就在这个主线程上运行。我们的程序都是由线程来执行的。

     

    多线程

      多线程指在单个程序中可以同时运行多个不同的线程执行不同的任务。

      多线程编程的目的,就是“最大限度地利用CPU资源”,当某一线程的处理不需要占用CPU而只和IO等资源打交道时,让需要占用CPU的其他线程有机会获得CPU资源。从根本上说,这就是多线程编程的最终目的。

      一个程序实现多个代码同时交替运行就需要产生多个线程。

      CPU随机地抽出时间,让我们的程序一会做这件事情,一会做另外的事情。

      从宏观角度来看,多个线程在同时执行(宏观并行),但是微观上来看,处理器的个数决定了某一个时刻可以同时运行的最大线程数,如单核CPU某一时刻只能有一个线程在执行(微观串行),双核的CPU在某一个时刻,最多可以运行两个线程,可以做到微观并行。

     

    Java中的多线程

      同其他大多数编程语言不同,Java内置支持多线程编程(Multithreaded Programming)。

      多线程程序包含两条或两条以上并发运行的部分,程序中每个这样的部分都叫做一个线程(Thread)。每个线程都有独立的执行路径,因此多线程是多任务处理的一种特殊形式。

      多任务处理被所有的现代操作系统所支持。然而,多任务处理有两种截然不同的类型:基于进程的基于线程的

      1.基于进程的多任务处理是更熟悉的形式。进程(process)本质上是一个执行的程序。因此基于进程的多任务处理的特点是允许你的计算机同时运行两个或更多的程序。

      举例来说,基于进程的多任务处理使你在运用文本编辑器的时候可以同时运行Java编译器。

      在基于进程的多任务处理中,程序是调度程序所分派的最小代码单位。

      2.而在基于线程(thread-based)的多任务处理环境中,线程是最小的执行单位。

      这意味着一个程序可以同时执行两个或者多个任务的功能。

      例如,一个文本编辑器可以在打印的同时格式化文本。

     

    Java线程模型

      Java多线程的优点就在于取消了主循环/轮询机制。一个线程可以暂停而不影响程序的其他部分。

      多线程允许活的循环在每一帧间隙中沉睡一秒而不暂停整个系统。

    线程组

      所有线程都隶属于一个线程组。那可以是一个默认线程组,也可以是一个创建线程时明确指定的组。

      说明:

      在创建之初,线程被限制到一个组里,而且不能改变到一个不同的组。

      若创建多个线程而不指定一个组,它们就会与创建它的线程属于同一个组。

    参考资料

      圣思园张龙老师Java SE系列视频教程。

  • 相关阅读:
    123
    使用Rsync自动实现网站增量备份
    一文了解 Java 各发行版本及新特性
    使用java命令出现Error: A JNI error has occurred, please check your installation and try again的错误
    orElse() 和orElseGet()方法之间的区别
    第一个Hello.java出现错误:找不到或无法加载主类Hello
    位运算统计二进制整数中1的个数
    GIMP使用笔记
    使用V2R做反向代理内网穿透
    Odoo 即时通讯 IM 设计思路
  • 原文地址:https://www.cnblogs.com/mengdd/p/2913628.html
Copyright © 2011-2022 走看看