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