20201019+袁鑫

学习日志

知识总结

多线程

并发和并行

并行:指两个或多个事件在同一时刻发生(同时执行)。当系统有一个以上CPU时,则线程的操作有可能非并发,当一个CPU执行一个线城市,另一个CPU可以执行另一个线程,两个线程不抢占CPU资源,可以同时进行,这种方式我们称之为并行。

并发:指两个或多个事件在同一个时间段内发生(交替执行)。当有多个线程在操作时,如果系统只有一个CPU,则她根本不可鞥真正同时进行一个以上的线程,他只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其他线程处于挂起状态。这种方式我们称之为并发

区别

并发和并行是既相似又有区别的两个概念,并行是指两个或者多个时间在同一时刻发生;而并发是指两个或者多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但是在单机处理系统中,每一个时刻却仅能在一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在计算机系统中有多个处理机,则这些可以并发执行的程序便可被分配到多个处理机上,实际并行执行,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可以同时执行。

注意:单核处理器的计算机肯定是不能并行的处理多个任务的,只能是多个任务在单个CPU上并 发运行。同理,线程也是一样的,从宏观角度上理解线程是并行运行的,但是从微观角度上分析却 是串行运行的,即一个线程一个线程的去运行,当系统只有一个CPU时,线程会以某种顺序执行 多个线程,我们把这种情况称之为线程调度。

进程和线程

进程

进程( Process )是指正在运行的程序,如 QQ ,是程序一次动态执行过程。它对应了从代码加载、执行 并执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到消亡的过程。操作系统同时管理一 个计算机系统中的多个进程,让计算机系统中的多个进程轮流使用CPU资源,或者共享资源。

特点:

  • 进程是系统运行的基本单位
  • 每一个进程都有自己独立的空间、一组系统资源
  • 每一个进程内部数据和状态都是完全独立的
  • 每一个应用程序运行时都会产生一个进程

线程

​ 线程是进程中执行运算的最小单位,一个进程在其执行过程中可以产生多个线程,而线程必须在某个 进程内执行。

​ 线程是进程内部的一个执行单元,是可以完成一个独立任务的顺序控制流程。一个进程中至少有一个 线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

进程和线程的区别

  • 进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线 程。
  • 线程:堆空间是共享的,栈空间是独立的,线程消耗的资源比进程小的多。

多线程的由来

多线程程序是扩展了多任务的概念:一个程序同时执行多个任务。通常,每一个任务称为一个线程 ( Thread ),它是线程控制的简称。可以同时运行一个以上线程的程序称为多线程程序

1:因为一个进程中的多个线程是并发运行的,那么从微观角度看也是有先后顺序的,哪个线程执 行完全取决于CPU 的调度,程序员是干涉不了的。而这也就造成的多线程的随机性。

2:Java 程序的进程里面至少包含两个线程,主进程也就是 main()方法线程,另外一个是垃圾回收机制线程。每当使用 java 命令执行一个类时,实际上都会启动一个 JVM,每一个 JVM 实际上就 是在操作系统中启动了一个线程,java 本身具备了垃圾的收集机制,所以在 Java 运行时至少会启 动两个线程。

3:由于创建一个线程的开销比创建一个进程的开销小的多,那么我们在开发多任务运行的时候, 通常考虑创建多线程,而不是创建多进程。

多线程和多进程的区别

本质的区别在于每个进程拥有自己的一套变量,而线程则是共享数据。线程之间共享数据是有风险的 (后边分析),然而共享变量使线程之间的通信比进程之间通信更有效、更容易。此外,在有的操作系 统中,与进程相比,线程更"轻量级",创建、撤销一个线程比启动新的进程开销要小的多。

线程调度

  1. 分时调度 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
  2. 2. 抢占式调度 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性), Java 使用的为抢占式调度。

创建线程类

​ 每个程序至少自动拥有一个线程,称为主线程。当程序加载到内存时启动主线程。 java 程序中 public static void main(String[] args) 是主线程的入口,运行 java 程序时会执行这个方法。

​ 创建一个新的执行线程有两种方法。 一个是将一个类声明为 Thread 的子类。 这个子类应该重写 Thread 类的方法 run 。 然后可以分配并启动子类的实例。

使用Thread类

java.lang.Thread 类代表线程。每个线程的作用是完成一定的任务,实际上就是执行一段程序流即 一段顺序执行的代码。 Java 使用线程执行体来代表这段程序流。

创建线程

public class MyThread extends Thread{
    @Override
    public void run(){
        //重写run方法
    }
}

构造方法

Thread 中常用的构造方法有:

  • public Thread() :分配一个新的线程对象。
  • public Thread(String name) :分配一个指定名字的新的线程对象。
  • public Thread(Runnable target) :分配一个带有指定目标新的线程对象。
  • public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定 名字。

线程状态

image-20201019225443736

Thread和Runnable区别

实现 Runnable 接口比继承 Thread 类所具有的优势:

  • 适合多个相同的程序代码的线程去共享同一个资源。
  • 可以避免 java 中的单继承的局限性。
  • 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
  • 实现了 Runable 接口的话,很容易的实现资源共享(一个实例多个线程运行)。
  • 线程池只能放入实现 Runnable 或 Callable 类线程,不能直接放入继承 Thread 的类。

心得

今天学习的线程还是比较简单,但是对于复习有点无头苍蝇的感觉,说明对知识的理解不够整体化,知识结构还不能融会贯通。

标签

评论

this is is footer