JAVA进程与线程
进程相当于世界,线程相当于各个国家,互相独立。可共享空气等等,同时也有自己的私有资源。
每个进程都有主线程main线程也就是我们程序入口main方法,会被JVM自动创建。
CPU处理一段代码的时间称之为时间片,时间片很短只有几毫秒所以多线程运行随机,一个时间片可能执行几次for循环也可能执行十几次for循环因为时间片用完了。即将代码转译成0101二进制。
线程被CPU执行是靠抢时间(CPU执行权限) 为什么会多线程加快程序运行时间 因为CPU处理指令需要其他硬件配合需要耗费时间此时CPU空闲。
比如线程A抢到时间片(几毫秒)去读取文件,那么CPU要先等文件先从硬盘读取到内存才能执行,这中间的时间CUP空闲。所以浪费时间。
线程分为 前台前程:
1、main线程(即main方法)以及所有new出来的线程。
2、后台线程(又称守护线程/精灵线程):比如GC,GC只考虑堆得中的内存。
特点:前台程序(包括main线程在内除GC外的所有线程)执行完毕就会关闭JVM虚拟机。所以前台线程运行完毕,后台线程随JVM一起关闭堆中残余的垃圾不会被GC回收而是随着JVM关闭一起被销毁。
线程的创建分为两种:
1、A类继承父类Thread,Thread t = new A();
2、B类实现接口Runnable接口,Runnable b = new B();Thread t2 = new Thread(b);
线程的使用:1、去执行非常耗时的代码。2、让多个代码同时执行。
线程状态:新建状态即new --> start方法调用后处于就绪状态(只有就绪状态才有资格去准备抢CPU执行权限)-->抢到时间片进入运行状态(执行run方法代码,如果执行到某个阻塞代码就会进入阻塞状态
,进入阻塞状态就会让出CPU执行权限,等待恢复就绪状态再去抢夺CPU)-->如果时间片用完了代码没用完就回到就绪状态,等下次抢到时间片再继续执行上次剩下的代码,
否则当执行完run方法所有代码(不管时间片有没有用完)都会进入死亡状态。
阻塞状态:代码暂停运行,释放CPU执行权限冰泉不参与CPU的争夺。包括以下几个:
1、挂起:sleep(毫秒)、join()、yield();
恢复就绪状态:
sleep(毫秒):睡觉时间完了。
main(){
t.sleep(1000)//t线程会睡眠一秒在这一秒不会抢夺CPU权限,当睡眠时间一秒结束t线程就会回到就绪状态重新抢夺CPU执行权限。
}
join:main()
{
t1.join();//挂起main线程,main线程会等待t1线程死亡才会回到就绪状态。
}
yield:主动让出CPU执行权限立刻回到就绪状态进行下一次CPU权限抢夺。