• 【多线程入门】&线程的三种创建方式&线程的生命周期&并行和并发的区别


    1 什么是进程、线程

    1.1 进程

    当我们启动了一个微信的时候,微信就是一个进程;
    同理当我们打开百度网盘的时候,就相当于开启了一个百度网盘进程。
    

    Windows系统可以打开“任务管理器”来查看开启的“进程”。

    在这里插入图片描述

    1.2 线程

    线程:是电脑操作系统能够进行运算调度的最小单位。一个进程可以存在多个线程。
    

    我们电脑CPU常见的4核4线程、2核4线程是什么意思?
    举例:如果把CPU比作一个银行CPU核心就相当于柜员(柜台窗口办公人员),线程数就相当于柜台窗口数量,柜员和窗口数量越多,电脑的数据处理能力就越强。

    在这里插入图片描述

    4核4线程 = 一人控制一个柜台窗口
    2核4线程 = 两个人同时管理四个柜台窗口,相当于一人控制两台柜台窗口。

    2 并行和并发的区别

    并行:指多个事件在同一个时刻发生;
    并发:指在某时刻只有一个事件在发生,某个时间段内由于CPU交替执行,可以发生多个事件。
    

    例如:高速公路上设有收费站,假设有两条道路;

    • 假如有两个收费入口,两条道的车都在自己的收费入口收费,这种情况类似于并行。 – 2核2线程
    • 假如收费入口通道只有一个,这时两个道路的车,就需要交替排队进入同一个收费入口进行收费,这种情况类似于并发; – 1核2线程
      在这里插入图片描述

    3 线程的三种实现方式

    3.1 继承Thread类 重写run方法

    /**
     * 创建Thread多线程类
     */
    class MyThread extends Thread {
    	@Override
    	public void run() {
    		System.out.println("线程T2");
    	}
    }
    
    public class Demo {
    	public static void main(String[] args) {
    		System.out.println("我是主线程方法开始");
    
    		Thread t1 = new MyThread();
    		t1.start(); // 执行多线程run方法
    
    		System.out.println("我是主线程方法结束");
    	}
    }
    

    3.2 简写通过匿名内部类方式实现多线程

    public static void main(String[] args) {
    	Thread t1 = new Thread() {
    		@Override
    		public void run() {
    			System.out.println("线程T2");
    		}
    	};
    	t1.start();
    }
    

    3.3 实现Runnable接口,重写run方法

    /**
     * 创建多线程类
     */
    class MyThread implements Runnable {
    	@Override
    	public void run() {
    		System.out.println("线程T2");
    	}
    }
    
    public class Demo {
    	public static void main(String[] args) {
    		System.out.println("我是主线程1方法开始");
    
    		// 创建线程类
    		MyThread myThread = new MyThread();
    		// 将线程类交给Thread管理
    		Thread thread = new Thread(myThread);
    		// 执行线程类的run方法
    		thread.start();
    
    		System.out.println("我是主线程2方法结束");
    	}
    }
    
    3.3.1 run()和start()的区别

    需要注意的是线程创建完成后,执行start()方法,才是真正启动线程去并发执行任务,而run()只是一个普通的实例方法,没有启动线程的作用。

    4 多线程的生命周期/五种状态

    线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态、死亡状态

    在这里插入图片描述

    4.1 新建状态(new)

    在执行new Thread(s),线程对象一旦创建就进入新建状态,此时线程还没有运行仍处于新建状态。

    4.2 就绪状态(runnable)

    在线程对象创建完成后调用start()方法进入就绪状态,但是线程不会立刻被CPU调度执行。

    4.3 运行状态(running)

    当CPU开始调度处于就绪状态的线程时,进入运行状态,开始执行run()方法。

    4.4 阻塞状态(blocked)

    处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权:
    例如:****

    线程通过调用sleep方法进入睡眠状态;
    线程试图得到一个锁,而该锁正被其他线程持有;

    4.5 死亡状态(dead)

    线程 run ()方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生。

    🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
    🍎原创不易,感觉对自己有用的话就❤️点赞👉收藏💬评论把。

  • 相关阅读:
    数学建模之线性规划(含MATLAB代码)
    快速排序图解(两种思想)
    长事务管理不再难:Saga模式全面解析
    设计模式-创建型模式(单例、工厂、建造、原型)
    kettle安装使用与部署
    Vue项目开发之表单验证&增删改功能
    JavaWeb在线商城系统(java+jsp+servlet+MySQL+jdbc+css+js+jQuery)
    CDH大数据平台 ERROR Heartbeating to 192.168.0.200:7182 failed
    【赠书第6期】MATLAB科学计算从入门到精通
    PyTorch深度学习(三)【Logistic Regression、处理多维特征的输入】
  • 原文地址:https://blog.csdn.net/qq_36881887/article/details/127120449