4. 多线程
什么是多线程,一组独立功能的静态计算机指令:
进程是一次程序动态的运行过程,他有就绪,阻塞,运行等状态。
进程:向系统申请资源的独立单位。
案例:开了一个QQ。就是开了一个进程,再打开迅雷,又开了一个进程,那我们在QQ上可以传输文字,语音,广告弹出,理解为开了一个线程,换句话理解就是线程是任务,一个进程可以管理多个线程,进程里面会至少包括一条线程,通俗地讲,进程是领导,线程是员工,进程管理线程,进程本身不执行,只是为线程提供运行环境申请内存空间。
进程的切换代价非常的大
1.单进程单线程:一个人在一个桌子上吃菜。
2.单进程多线程:多个人在同一个桌子上一起吃菜。
3.多进程单线程:多个人每个人在自己的桌子上吃菜。
多线程:
(1)一个进程里面同时执行多个任务。
(2)一个进程里面至少有一个线程
(3)开启多个线程是为了同时执行多个任务,也是同时执行多部分代码。
利弊:
好处:解决了多任务同时执行的问题。
弊端:线程切换花费额外的资源,同时切换也是一个耗时的步骤。
如何让创建线程:
第一种方式
(1)将类声明为Thread的子类
(2)然后将这个子类重写run方法
(3)创建子类对象
(4)开启线程
一般来讲,耗时的方法都不放在主线程里,
线程的常用属性: name获取线程的名字,默认为Thread-x
这种方式开启多线程,要求该类不能在继承其他的父类,因为java是单继承。但是我们可以用接口的方式来扩展。
第二种方式:创建一个类,实现runnable接口,实现了run方法,创建线程Thread(myRunnable)开启。
一般我们都是使用第二种方法创建线程,
注意:线程的开启是用start,而不是直接run,如果直接使用run,那程序的执行就和函数的调用没有区别了,一直在调用主线程。
线程调度:
线程的优先级:
调整线程的优先级只是提高CPU执行这条线程的概率,并不一定执行完毕再去执行其他线程。
线程让步:
线程插队:
线程安全:
出现线程安全的条件
(1)多个线程同时访问共享资源(共享数据)
(2)操作共享数据的代码有多条
解决办法:
对于不能被同步执行的代码,我们只要保证当前有一个线程执行的时候,其他线程不能进入执行。
类似公共厕所,进入之后先上锁,离开之后先开锁,这个就保证里面只有一个人在使用。
Java中提供给我们一种“同步代码块”可以解决这个问题
好处:解决了线程安全的问题
坏处:相对降低了效率,因为每次都要去判断是否有同步锁。