一、进程是什么,线程是什么?
(1)理解:
进程是一个主体任务,线程是这个进程下的子任务,下图解释:
描述:一个餐厅好比一个进程,一个餐厅下面有多个职位的厨师,他们分别是不同进程,执行不同子任务,当然我们一个进程里面可以有多个线程。单核cpu情况下,不同的进程在不同的时间段去使用 CPU 资源。 如果是多核cpu可以在同一时间有多个餐厅,多个进程。
(2)单核cpu和多核cpu:
多核CPU并不代表多个CPU。
多核CPU指的是单个CPU芯片上集成了两个或多个独立的计算核心,这些核心可以同时执行不同的任务,从而提高处理器的性能,每个核心都拥有自己的执行单元,可以独立执行指令。
*(3)cpu调度进程过程
二、进程间通信
总结
看着是不是很复杂,进程之间通信就好比,各个餐厅之间通信,万一餐厅之间间隔很远呢?没错不只是你计算机处理这些进程之间通信也很复杂,那怎末办呢?这里我们引入了多线程,就好比原来是两家餐厅干的活儿集中在一家干了,这样是加重了厨师们的负担但是大大减轻了cpu创建进程消耗的资源。
三、多线程
(1)"并发编程" 成为 "刚需".
- 单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程能更充分利用多核 CPU 资源.
- 有些任务场景需要 "等待 IO", 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程
(2)虽然多进程也能实现 并发编程, 但是线程比进程更轻量.
- 创建线程比创建进程更快.
- 销毁线程比销毁进程更快.
- 调度线程比调度进程更快
*(3)进程和线程之间关系
1、进程包含线程、一个进程可以有一个线程或多个线程
2、进程和线程、都是用来实现并发变成场景的,但是线程比进程更加轻量、高效。
3、同一进程的线程之间共用同一份资源(内存+硬盘),省去了申请资源的开销,所以轻量。
4、进程间不会相互影响,但是同一进程中的线程之间可能相互影响。
5、进程是资源分配的基本单位,线程是调度执行的基本单位。
四、创建多线程
(1)创建一个单线程
class MyThread extends Thread{//一个线程@Overridepublic void run() {System.out.println("hello thread");//run方法只是描述线程执行的任务}
}
public class Main {public static void main(String[] args) {Thread t=new MyThread();t.start();//线程调用}
}
(2)多线程创建
class MyThread extends Thread{//一个线程@Overridepublic void run() {while (true){System.out.println("hello thread");//run方法只是描述线程执行的任务try {Thread.sleep(1000);//sleep就是休息一下在执行,方便结果观察} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class Main {public static void main(String[] args) throws InterruptedException {//这里main也是一个线程Thread t=new MyThread();t.start();//线程调用while (true){System.out.println("hello main");Thread.sleep(1000);}}
}
总结:我们发现线程是并发执行的,就是同时打印hello main 和 hello thread ,但是这两者打印顺序是随机的。
(3)简化的多线程写法(lambda表达式)
public class Test1 {public static void main(String[] args) throws InterruptedException {Thread t=new Thread(()->{while (true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}} });t.start();while (true){System.out.println("hello main");Thread.sleep(1000);}}
}