一.常见方法
1.yield();
当前获取cpu时间的线程释放cpu,但是并不代表他不会继续抢占,相反他还会和剩余的其他线程重新抢占cpu
和线程的优先级有关
2.join();
迅雷下载和迅雷看看:边下边看
需求:如果没有加载完成是无法播放的,一个线程是下载,一个线程是播放,需要保证顺序
被设置为join的线程执行完毕以后,其他线程才会继续执行
3.守护线程: Thread.setDaemon(boolean flag)
一个线程如果被设置为守护线程以后,当其他线程执行完毕,守护线程不管是否还在执行,他会强制结束
二.同步
一群人上公交车…
同步:依次排队上公交车,前面的人上了之后后面的才能上
异步:一群人上公交车,只有又能进去的位置就进去,比如窗户,后门,天窗,
异步的效率会比同步的快,但是可能会有数据的不安全的问题
多线程并发执行就容易出现线程安全问题
原因:共享实例变量数据更新不一致
如何解决:
1.使用synchnorized关键字锁对象--解决完自动解锁
2.使用synchnorized代码块 --自动解锁
3.使用互斥锁--需要手动
死锁的概念:
高圆圆:苏老公,今天我们吃了饭去看电影
苏老公:高圆圆,今天我们看了电影去吃饭
最终互不相让—>饭没得吃,电影没得看
两个线程互相占据了对方的锁对象,
三.wait和notify
1.方法的一些使用
wait()和sleep(long time)
a.wait()他是Object类的方法,sleep他是Thread的方法
b.wait()导致线程阻塞,必须使用其他方法唤醒
c.sleep调用以后,线程会进入休眠状态,让出cpu的优先级(时间片)
2.生产者消费者模型
三个土匪分脏款:
一个老大和三个土匪历尽千辛万苦,终于抢来了10000大洋,
然后大哥给三人开三个线程分钱,前期怎么分, 发现最后得到的钱都不能凑成10000快,
三人互相猜忌,总认为大哥私藏了一部分钱或者给其中的人多分了 钱,请你帮大哥想想办法,
保证最后分的钱能够凑成10000大洋