多线程秋招真的很常问,自己看B站视频笼统的过了一遍复习。
这个老师讲的想对比较适合初学,高阶建议啃书。😀
记了一些笔记写成博客分享出来。📕
在这推荐up主:狂神说。👍
指路b站视频链接:
https://www.bilibili.com/video/BV1V4411p7EF/
多线程 Java.Thread
P1 线程简介
P2 线程创建
初识并发
静态代理+lambda表达式
P3 线程状态
P4 线程同步
P5 线程通信问题
P6 线程池
P1 线程简介
1.基本概念
多任务:
看起来多个任务在做,本质大脑在同一时间依旧只做了一件事情。
边吃饭边玩手机
多线程:
多个线程同时执行。
一条道路发生道路堵塞,效率低;加多个车道,能充分利用道路。
普通方法调用与多线程:
程序:
程序是指令和数据的有序集合,本身没有任何运行含义。静态概念
进程(Process):
操作系统资源分配的最小单位 动态概念
多进程:都去银行汇款,如果甲和乙用的不是同一张银行卡,其实根本办的不是一件事
线程 (Thread):
操作系统调度的最小单位(操作系统CPU资源分配的最小单位)
多线程:都去银行汇款,如果甲和乙用的是同一张银行卡,其实办的就是同一件事
进程与线程:
进程至少有一个线程(主线程)。
线程之间资源共享,资源由进程申请
线程之间可通信,主线程子线程。
JVM中的线程区别于OS中的线程。
JVM进程结束,当非后台线程结束时。
注意:
很多多线程是模拟出来的,**真正的多线程是指有多个cpu,即多核。如服务器。
如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能执行一个代码,因为切换的很快,所以就有同时执行的错局。
核心概念:
1.线程就是独立的执行路径;
2.在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程;
3.main()称之为主线程,为系统的入口,用于执行整个程序;
4.在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为的干预的。
5.对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;
6.线程会带来额外的开销,如cpu调度时间,并发控制开销。
7.每个线程在自己的工作内存交互,内存控制不当会造成数据不一致
2.为什么需要多线程模型处理?优点
有些场合 可能提升速度;(增加线程极限、本身创建线程+销毁线程 也需要耗费时间)
有些场合 必须使用多线程;(阻塞式IO,一个调度单位倒下,剩下调度单位还能抢CPU工作)
单线程耗时操作(上传大文件)会出现阻塞。
线程可能被从CPU上调度下来的5种情况?
1.高优先级抢走
2.执行结束
3.在等IO
4.主动放弃
5.时间片耗尽
3.多线程谁先谁后?
优先级只是建议,不是强制!!!
t.join( ); 主线程阻塞,直到t线程执行结束,猜接着往下执行
输出结果:大概率是 main–>a–>b ,其他情况都有可能!!!!!!!!!!
大概率CPU最先分配给主线程main,主线程结束在分配给其他线程。
public class 线程执行顺序与主线程对比 {
private static class A extends Thread{
@Override
public void run(){
System.out.println("我是A");
}
}
private static class B extends Thread{
@Override
public void run(){
System.out.println("我是B");
}
}
public static void main(String[] args) {
A a=new A();
B b=new B();
//a、b 放入就绪队列中
a.start();
b.start();
System.out.println("我是main");
}
}