清华扫地僧整理的全网最全多线程详解,看完怀疑自己的认知

前言现在越来越多的公司,对精通多线程的的人才越来越重视,可见多线程技术有多热门 。今天,小编结合清华扫地僧级别大佬的分享,为大家带来这篇多线程的总结,希望大家能够喜欢 。

清华扫地僧整理的全网最全多线程详解,看完怀疑自己的认知

文章插图
 
一、线程概述
几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程 。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程 。
二、线程与进程进程概述:
几乎所有的操作系统都支持进程的概念,所有运行中的任务通常对应一个进程( Process) 。当一个程序进入内存运行时,即变成一个进程 。进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位 。
进程特征:
1、独立性:进程是系统中独立存在的实体,它可以拥有自己独立的资源,每一个进程都拥有自己私有的地址空间 。在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间
2、动态性:进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合 。在进程中加入了时间的概念 。进程具有自己的生命周期和各种不同的状态,这些概念在程序中都是不具备的
3、并发性:多个进程可以在单个处理器上并发执行,多个进程之间不会互相影响 。
线程:
线程与进程相似,但线程是一个比进程更小的执行单位 。一个进程在其执行的过程中可以产生多个线程 。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程 。
并发和并行:
并发:同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行
并行:同一时刻,有多条指令在多个处理器上同时执行
多线程:概述:
多线程就是几乎同时执行多个线程(一个处理器在某一个时间点上永远都只能是一个线程!即使这个处理器是多核的,除非有多个处理器才能实现多个线程同时运行 。) 。几乎同时是因为实际上多线程程序中的多个线程实际上是一个线程执行一会然后其他的线程再执行,并不是很多书籍所谓的同时执行 。
多线程优点:
  1. 进程之间不能共享内存,但线程之间共享内存非常容易 。
  2. 系统创建进程时需要为该进程重新分配系统资源,但创建线程则代价小得多,因此使用多线程来实现多任务并发比多进程的效率高
  3. JAVA语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了Java的多线程编程
三、使用多线程多线程的创建:(1)、继承Thread类:
第一步:定义Thread类的之类,并重写run方法,该run方法的方法体就代表了线程需要执行的任务
第二步:创建Thread类的实例
第三步:调用线程的start()方法来启动线程
public class FirstThread extends Thread {private int i;public void run() {for(;i<100;i++) {System.out.println(getName()+" "+i);}}public static void main(String[] args) {for(int i=0;i<100;i++) {//调用Thread的currentThread方法获取当前线程System.out.println(Thread.currentThread().getName()+" "+i);if(i==20) {new FirstThread().start();new FirstThread().start();}}} }(2)、实现Runnable接口:
第一步:定义Runnable接口的实现类,并重写该接口的run方法,该run方法同样是线程需要执行的任务
第二步:创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象
public class SecondThread implements Runnable {private int i;@Overridepublic void run() {for(;i<100;i++) {System.out.println(Thread.currentThread().getName()+" "+i);}}public static void main(String[] args) {for(int i=0;i<100;i++) {System.out.println(Thread.currentThread().getName()+" "+i);if(i==20) {SecondThread s1=new SecondThread();new Thread(s1,"新线程1").start();;new Thread(s1,"新线程2").start();}}}}(3)、使用Callable和Future创建线程
细心的读者会发现,上面创建线程的两种方法 。继承Thread和实现Runnable接口中的run都是没有返回值的 。于是从Java5开始,Java提供了Callable接口,该接口是Runnable接口的增强版 。Callable接口提供了一个call()方法可以作为线程执行体,但call()方法比run()方法功能更强大 。


推荐阅读