今天阴天,天气凉爽。今天讲了线程间的通信。其中涉及了许多问题。第一个是出现了妖,第二个是多生产者和多消费者之间的问题。之后讲了jdk1.5以后用lock和condition替代了同步函数,同步代码块和object中的三个方法。
线程间通信:多个线程在处理同一个资源。实例中,两个线程同时操作两个共享数据,但是不能使数据静态,也不能使用单例设计模式,因为这些数据在设计时,可能会有更多的情况要使用。所以就采用传入对象参数的办法。
在讲实例的过程中讲到了等待唤醒机制,并涉及了3个方法。
1,wait()
2,notify()
3,notifyall()
实例中解决了轮流输出,用到了flag做判断,当执行完成后就判断,如果值还没有被取走,那么这个线程就进入冻结状态。
其中第一次的空唤醒是可以存在的。
这3个方法只对自己的锁中有效,比如A锁中被wait,B锁中的notify不能将其唤醒。这些方法都是监视线程状态,而锁是对线程进行同步。这三个方法是Object类中的方法,使用时需要用对象调用,而获取线程名称getName是线程方法调用的方式不一样
然后讲到了多消费者和多生产者的问题
其中就遇到了死锁的情况,是因为所有的线程都进入了冻结状态
if判断标记,只有一次,会导致不该运行的线程运行,出现数据错误的情况
While判断标记,解决了线程获取执行权后,是否要运行
Notify只能唤醒一个线程,如果本方唤醒了本方,没有意义。而且while判断标记+notify会导致死锁
Notifyall解决了本方线程一定会唤醒对象线程的问题。
解决了多生产者多消费者问题,就带出了lock对象。在jdk1.5以后将同步和锁封装成了对象。并将操作锁的瘾式方式定义到了该对象中,将瘾式动作变成了显示动作。
释放锁要在finally中,如果进程中间跳转或者出现问题,必须释放锁才能让其它进行继续操作。Lock方法替代同步,condition替代了object中的3个方法
Lock接口:出现替代了同步代码块或者同步函数。将同步的瘾式锁操作变成了显示锁操作。同时更为灵活,可以一个锁加上多组监视器。Lokc()获取锁,unlock()释放锁,condition接口:出现替代了object中的wait notify notifyall方法
将这些监视器方法单独进行了封装,变成condition监视器对象。可以和任意锁进行组合。
Await()
Signal();
signalAll()
判断时,while比if更加安全。
Wait和sleep的区别
1,wait可以指定时间也可以不指定
2,在同步中时,wait释放执行权,释放锁
这时可以优化多生产者多消费者的问题,可以建立两组监控器,只要唤醒对方的任意线程即可
停止线程的方法就是让run方法结束。控制循环通畅定义标记来完成,一般只要循环结束,run语句就结束了。
可以使用interrupt()方法将线程从冻结状态强制恢复到运行状态中来,让线程具有cpu的执行资格,但是强制会发生interruptedexcpetion
Setdeamon方法使线程变为守护线程,后台线程。Jion方法申请加入运行,一般用于临时线程,哪个线程运行了jion方法,哪个方法就释放了执行资格和执行权。Setpriority(THREAD.MAX_PRIORITY)将线程设置成最高优先级,可以设置最低,0,一般时为5,最高10这几种情况。Yield(),暂停当前进程,释放执行权,但是自己还是有获得执行权的机会。
晚上讲了eclipse的基本使用,软件的基本使用要多动手实践。
---------------------- android培训、 java培训、期待与您交流! ----------------------详细请查看: http://edu.youkuaiyun.com/heima