目录
💕💕💕💕💕💕💕💕💕💕💕💕💕💕分隔符💕💕💕💕💕💕💕💕💕💕💕💕💕💕💕
💗1.什么是线程?
线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
简单来说线程是包含在进程内部的,就相当于一个工厂,这个工厂就相当于进程,工厂里面有许多的流水线,这个流水线就相当于线程
💗2.有了进程为什么要有线程?
☁️2.1.
①进程一个时间只能干一件事,如果想进程一个时间干很多事,那么进程也无能为力
②许多进程一起工作时,如果有一个进程挂了,可能会影响其他的进程,这是非常不利的
举个例子:我们炒一道菜的时候需要很多的步骤,例如炒土豆丝,首先需要清洗,然后去皮,在进行浸泡,最后在下锅,需要很多的步骤,想要在短时间内把这道菜做出来是不太可能的,如果有个东西能帮你分担这些事,你就不会这么的手忙脚乱了,这个东西就叫做线程
以上这个例子我们就能清楚的知道线程的好处
☁️2.2.并发(Concurrent)编程
随着硬件性能的迅猛发展与大数据时代的来临,并发编程日益成为编程中不可忽略的重要组成部分。简单定义来看,如果执行单元的逻辑控制流在时间上重叠,那它们就是并发(Concurrent)的。并发编程复兴的主要驱动力来自于所谓的“多核危机”
①单核CPU的发展遇到了瓶颈,想要提高算力,就需要多核CPU,而并发编程能更充分的利用多核CPU的资源
②有些任务用到了等待 IO ,为了让等待IO的时间能做其他的事情,也就需要用到并发编程
对于并发编程,虽然多进程也能实现,但是多线程比多进程更轻量
💦创建线程比创建线程更快
💦销毁线程比销毁进程更快
💦调度线程比调度进程更快
虽然线程比进程更轻量,但是人们还是不满足,于是又有了“线程池” 和 “协程”(此处不过多介绍)
💗3.经典面试题:进程和线程的区别?
⭐线程是包含在进程里面的,每一个进程至少包含一个线程,即主线程
⭐和进程之间不共享内存空间,而线程之间是共享一个内存空间的
⭐进程是系统分配资源的最小单位,而线程是系统调度的最小单位
⭐线程和进程都是为了实现并发编程,而线程相比较于进程更加的轻量
1.创建线程比创建线程更快
2.销毁线程比销毁进程更快
3.调度线程比调度进程更快
💗4.Java的线程和操作系统的线程有什么区别
⭐线程是操作系统中的概念. 操作系统内核实现了线程这样的机制, 并且对用户层提供了一些 API 供用户使用❗
简单介绍一下内核:
现代操作系统都采用进程的概念,为了更好的处理系统的并发性、共享性等,并使进程能够协调地工作,仅依靠计算机硬件提供的功能是远远不够的。例如,进程的调度就不能用硬件来实现,必须使用一组基本软件对硬件资源进行改造,以便为进程的执行提供良好的运行环境,这个软件就是内核(kernel)。
简单来说,内核就是操作系统中的一组程序模块,作为可信软件来提供支持进程并发执行的基本功能和基本操作,具有访问硬件设备和所有内存空间的权限。不夸张的说,内核是操作系统的核心。
🐍Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进行了进一步的抽象和封装 ❗
💗5.第一个多线程程序
class Mythread extends Thread{
@Override
public void run() {
System.out.println("the first thread");
}
}
public class TestDemo {
public static void main(String[] args) {
Thread thread = new MyThread();
thread.start();
}
}
☀️具体分析:
@Override
public void run() {
System.out.println("the first thread");
}
重写了Thread里的run方法,里面的代码就表示这个线程具体要干什么,这里相当于安排任务,病是不是说这里的代码一写出来就可以执行这个线程
thread.start();
start方法是真正的创建出线程的方法,只有调用了start方法,线程才能被创建出来,上面重写的run方法也才能被执行
💗6.五种创建线程的方法
🐔创建一个子类继承Thread
class Mythread extends Thread{
@Override
public void run() {
System.out.println("the first thread");
}
}
public class TestDemo {
public static void main(String[] args) {
Thread thread = new MyThread();
thread.start();
}
}