多线程(韩顺平)
进程:正在运行的程序
加载到内存里
线程是进程的实体,线程也可以由线程创建
单线程:同一时刻只能有一个线程
并发:同一时刻多个任务交替执行
1,继承Thread类(这个类也是实现runable接口 )
run()方法是普通方法,没有启动新的线程
接口是一个规范
我知道你的方法名,
我才知道找什么去调用什么
[1] native 本地方法start0() 底层C/C++实现
start0()==>线程可用,具体什么时候run。不知道等CPU调度。
A类已经继承了B类,这就不能继承Thread类就只能通过实现runable接口。让这个对象的run方法可以多线程执行。
对于接口的理解:
实现了这个接口,有运行这个接口的能力;
就是说我这个接口里定义的方法你都能实现(除非是抽象类)。既然我的方法你都能实现,那你就是我的好兄弟,就可以说你是我这个类的。那你通过代理模式传进来的时候我就验证你有没有实现runable这个接口,如果实现了就是可以帮你找房子(实现代理模式),用来启动多线程。
Thread类实现多线程,传进来一个实现了runable接口的对象,经过判断对他进行代理。为这个对象添加启动start0()的方法。
代理模式。只要这个被传进来这个可以实现。就来实现。
两个thread都可以在执行T3(实现runable接口)
两个线程共享资源
线程的退出
1,运行结束自动退出
2,变量去通知{通过一个set方法}
intrrupt中断 只能叫醒sleep的,
yeild礼让,当前线程调用当前对象的yeild方法,可以降低当前线程的优先级
jion,让别的线程来插队
守护线程:主线线程结束了,自动结束不用特意通知。
.setDeamon(true)
.start()
JDK: Thread.state
等待代码块的锁===>bloked
wait()
join()
LockSupport.park()====>Waiting
runable(){ ready running}
下面是线程的几个状态:
[new]刚开始创建还没有.start()方法
[runable]可运行状态,内部又分为ready和runing这个由CPU调度或者礼让函数等
[TimeWaiting]sleep(时间),wait(时间)
[Wating]wait(void)
[Blocked]加锁
[Timinated]结束运行的了
同步:敏感数据在任何同一时刻,数据只能被一个线程访问。【对这个内存地址进行操作】
Synchronized非公平锁 (自己抢谁抢到算谁的)
1,代码块Synchronized(对象){
同步代码块
}
2,方法限制 public Synchronized void fun(){
同步代码块
}
互斥锁
同步的局限性:降低程序的执行效率;
这个票数的数据
非静态:加载当前对象
静态:加载类上
三个线程共享这一个 object
同步代码快执行结束,自动释放锁。
当前线程遇到break,return,释放锁。
出现未处理的异常,error,释放。
执行wait方法释放锁。
线程执行时调用sleep(),yield()不会释放锁
线程被挂起suspend
Suspend(),resume()不要用