20110906 线程的生命周期和线程的同步
1、 新建状态。 当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。
2、 就绪:线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源
3、 运行:线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。
4、 死亡 :自然终止:正常运行run()方法后终止
异常终止:调用stop()方法让一个线程终止运行
5、 堵塞
a) Sleep() 将程序睡眠。 当时间到了。恢复到就绪状态
b) Wait() 调用motify()(唤醒线程)方法回到就绪状态
c) Suspend() 被另一个线程所阻塞 resume()方法恢复
6、 线程的优先级
a) 把线程从就绪状态进入运行状态的过程叫做线程调度,负责调度工作的机构叫做调度管理器
b) 优先级 线程的优先级的取值范围是1—10
i. MAX_PRIORITY
ii. NORM_PRIORITY
iii. MIN_PRIORITY
iv. 得到货修改线程的优先级 final int getPriority() final void setPriority(int newPriority)
7、 常用方法 run() start() sleep(long t) sleep(long millis,int nanos) nanos参数为有纳秒
a) Yield() 暂停线程,让步的方法 当前线程进入就绪状态,不是堵塞状态。
b) Join() 方法 让线程加入执行,执行某一线程join方法的线程会被冻结,等待某一线程执行结束,该线程才会恢复到可运行状态
c) Wait() 与notify() 方法 是成对。 暂停和恢复
d) interrupt(): 清楚线程的冻结状态 强制清楚
e) stop() 有风险,终止。已过时
停止方法: 1。在循环设置标志,判断用break跳出循环
2.线程处于堵塞状态, interrupt() 中断线程 interrupted()测试是否中断。在第一次调用已清除了其中断状态之,且第二次调用检验完中断状后态前,当前线程再次中断的情况除外,如果连续两次调用该方法,则第二次调用将返回 false isIterrupted() 此时线程是否已经中断,线程的中断状态不受该方法的影响。
f) isAlive() 判断是否为活动的线程。
g) setDaemon(true) 该方法要在线程开启前使用, 和前台线程一样开启,病抢资源运行。所不同的是,当前台线程都结束 后,后台线程会自动结束。无论后台线程处于什么状态都会自动结束
h) currentThread() 获取到当前的线程对象 然后 t1.getName() 获得线程名字
9、线程的同步 Synchronization
互斥锁 标记,这个标记用来保证在任一时刻,只能有以个线程访问该对象 关键字 synchronized 用来与对象的互斥锁联系
加锁方式 synchronized(this){} 在方法声明中,表示整个方法为同步方法
Public synchronized char pop(){} 同步方法只有一个。
锁的是对象。
好处 解决了线程安全问题
弊端 降低了运行效率
同步嵌套,容易出现死锁。
解决死锁 wait() 方法