1.多任务处理有两种类型:
基于进程:一个进程独享内存空间
基于线程:在进程内部共享内存地址空间
2.进程是指一种“自包容”的运行流程,有自己的地址空间,线程是进程内部单一的一个顺序控制流
3.基于进程的特点是允许计算机同时运行两个或更多的程序
4.基于线程的多任务处理环境中,线程是最小的处理单位
5.进程就是一个应用程序
6.进程内部在分多任务,这个就是线程
7.进程的开销以及切换成本相对于线程来说都要多
通过两种方法创建Thread对象:
thread已经被写好,我们直接继承Thread然后重写他的run方法就行了
声明一个Thread类的子类,并重写run()方法。(mythread 这是一个子线程)
他的实现是:直接new出子类对象,调用start方法
thread已经被写好,我们直接继承Thread然后重写他的run方法就行了
声明一个Thread类的子类,并重写run()方法。(mythread 这是一个子线程)
他的实现是:直接new出子类对象,调用start方法
声明一个实现Runnable接口的类,并重写run()方法。(这种方法是将子线程对象交给真正的thread对象)
他的实现是:先new出therad对象,传入实现类对象(直接在括号里new 实现类对象),调用therad对象的start方法
线程五种状态:
新建状态:new出Thread对象(产生线程对象)
就绪状态:执行start方法之后,执行run方法之前
运行状态—(在运行中可能会有)中断状态:运行过程就是执行run方法
中断状态:就相当于是在多线程中执行字线程一,没执行主线产能或者自线程二,然后过一会儿在执行线程一
中断原因:
1.由于优先级的关系,线程没有抢到CPU。(优先级最小为一级,最大为十级、默认是五级,不代表十一定大于一,而是指他的一种几率)
2.使用sleep()方法使线程休眠(sleep到点恢复的时候不是立马执行,而是重新参与CPU的竞争)
3.通过wait()方法,使线程等待(wait—notify机制)
4.通过调用yield()方法,线程已显示出让CPU控制权(挂起,不管后续,强制性的)
5.线程由于等待一个I/O时间被阻塞(等待输入或者输出时候)
死亡状态:run方法执行完
线程安全问题:
描述:多个线程访问同一资源对象,可能会造成资源对象数据混乱
解决:使用同步(锁)的方式解决—-使用关键字synchronized
1.在资源身上使用同步关键字—-同步方法
2.在资源调用处加同步关键字—-同步块
在同步的时候可能会带来新问题—-死锁
描述:当两个线程访问一对相互依赖的同步资源对象的时候,会出现死锁问题,就是两个都是靠同一个东西才能执行,并且两个都是有synchronized,此时两个都访问不到,就需要用wait来是一个进入等待,等另一个做完在notify(唤醒)另一个
解决:用wait—-notify机制
带来的后果:线程安全了,执行效率就底。