一、进程是什么,线程是什么?
(1)理解:
进程是一个主体任务,线程是这个进程下的子任务,下图解释:
描述:一个餐厅好比一个进程,一个餐厅下面有多个职位的厨师,他们分别是不同进程,执行不同子任务,当然我们一个进程里面可以有多个线程。单核cpu情况下,不同的进程在不同的时间段去使用 CPU 资源。 如果是多核cpu可以在同一时间有多个餐厅,多个进程。
(2)单核cpu和多核cpu:
多核CPU并不代表多个CPU。
多核CPU指的是单个CPU芯片上集成了两个或多个独立的计算核心,这些核心可以同时执行不同的任务,从而提高处理器的性能,每个核心都拥有自己的执行单元,可以独立执行指令。
*(3)cpu调度进程过程
二、进程间通信
进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存 在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备”
隔离性
(
Isolation
)
“
。
但现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程和进程进 行配合地达到应用的目的,如此,进程之间就需要有进行“
信息交换
“
的需求。进程间通信的需求就应运 而生。
目前,主流操作系统提供的进程通信机制有如下:
1.
管道
2.
共享内存
3.
文件
4.
网络
5.
信号量
6.
信号
总结
看着是不是很复杂,进程之间通信就好比,各个餐厅之间通信,万一餐厅之间间隔很远呢?没错不只是你计算机处理这些进程之间通信也很复杂,那怎末办呢?这里我们引入了多线程,就好比原来是两家餐厅干的活儿集中在一家干了,这样是加重了厨师们的负担但是大大减轻了cpu创建进程消耗的资源。
三、多线程
(1)"并发编程" 成为 "刚需".
- 单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程能更充分利用多核 CPU 资源.
- 有些任务场景需要 "等待 IO", 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程
(2)虽然多进程也能实现 并发编程, 但是线程比进程更轻量.
- 创建线程比创建进程更快.
- 销毁线程比销毁进程更快.
- 调度线程比调度进程更快
*(3)进程和线程之间关系
1、进程包含线程、一个进程可以有一个线程或多个线程
2、进程和线程、都是用来实现并发变成场景的,但是线程比进程更加轻量、高效。
3、同一进程的线程之间共用同一份资源(内存+硬盘),省去了申请资源的开销,所以轻量。
4、进程间不会相互影响,但是同一进程中的线程之间可能相互影响。
5、进程是资源分配的基本单位,线程是调度执行的基本单位。
四、创建多线程
(1)创建一个单线程
class MyThread extends Thread{//一个线程
@Override
public 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{//一个线程
@Override
public 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);
}
}
}