JUC并发:
进程:进程相当于程序的是实例化,是负责资源管理的,在java中进程作为资源分配,管理的最小单位;
线程:一个线程就是一个指令流,负责将指令按一定顺序交付给CPU,在java中,线程作为一个最小的调度单位【CPU根据线程找指令】;
在windows中,进程是不活动的,只是作为线程的容器【线程相当于进程的子集】;
进程通信【基本相互独立】:
- 同一台计算机的进程通信称之为 IPC;
- 不同计算机的进程通信:HTTP;
线程在进程中,它们共享进程内的内存,资源;
线程内的指令执行完了,线程也就结束了;
任务调度器【将cpu时间片分给不同的线程使用】:多线程并发【concurrent】;
并行【parallel】;
同步:需要等待结果返回,才能继续顺序执行,【阻塞】;
异步:不需要等结果返回,多线程是异步调用;
Thread【线程】 和 Runnable【任务】:
- 组合关系优于继承关系;
- FutureTask是进一步具有返回值,和异常的Runnable;
查看进程和线程方法:
# windows
tasklist #查看进程
taskkill #杀死进程
#linux
ps -fe #查看所有进程
ps -fe | grep java
kill #杀死进程
线程运行原理:
- jvm由堆,栈,方法区【类的字节码】组成,其中的栈内存就是线程使用,每一个线程启动,虚拟机都会为其分配一个栈内存;
- 每个栈由多个栈帧组成,对应每次方法调用时,所占用的内存;
- 每个线程只有一个活动栈帧,对应当前正执行的那个方法;
- 每个线程具有一个程序技术器,存放下一次要运行的代码,交给cpu;
- 每一个线程【相互独立】的组成:
- 程序计数器;
- 方法的栈帧【相互独立】的创建:
- 局部变量表,方法返回地址【退出地址】,锁记录,操作数栈;
- 线程上下文切换:
- 被动的上下问切换:
- 线程时间片用完;
- 有更高优先级线程需要运行【eg 垃圾回收器】;
- 主动的线程切换:
- 线程调用了:sleep, yield, join, pack, sychronized, lock等函数;
- 由程序计数器记录下一次将要运行的指令,并且保存每个栈帧的信息【线程太多,影响性能】;
- 被动的上下问切换: