Java第十天

线程间通讯:

多个线程在处理同一资源,但是任务却不同。

多生产者,多消费者的问题:

if判断标记,只有一次,会导致不该运行的线程运行了。出现了数据错误的情况。

while判断标记,解决了线程获取执行权后,是否要运行。

notify:只能唤醒一个线程,如果本方唤醒了本方,没有意义。而且while判断标记+notify会导致死锁。

notifyAll解决了本方线程一定会唤醒对方线程的问题。

同步代码块中,对于锁的操作是隐式的。

jdk1.5以后将同步和封锁封装成了对象。并将操作锁的隐式方式定义到了该对象中,将隐式动作变成了显式动作。

Lock接口:出现替代了同步代码块或者同步函数。将同步的隐式所操作变成现实锁操作。同时更为灵活。可以一个锁上加上多组监视器。

lock():获取锁。

unlock():释放锁,通常需要定义finally代码块中。

Condition接口:出现替代了Object中的wait notufy notifyAll方法。将这些监视器方法单独进行封装,变成Condition监视器对象。可以任意锁进行组合。

await();

signal();

signalAll();

sleep和wait区别:

1.wait可以指定时间也可以不指定,sleep必须指定时间。

2.在同步中时,对cpu的执行权和锁的处理方式不同。

   wait:释放执行权,释放锁      sleep:释放执行权,不释放锁。

停止线程:

1.stop方法(已过时,该方法具有固有的不安全性) 

2.run方法结束。

任务中都会有循环结构,只要控制住循环就可以结束任务。

控制循环通常就用定义标记

使用interrupt(中断)方法

该方法是结束线程的冻结状态,使线程回到运行状态中来。

使用interrupt()方法将线程从冻结状态强制恢复到运行状态中来,让线程具备CPU的执行资格。但是强制动作会发生InterruptedException,记得要处理。

setDaemon:后台线程,守护线程

join:临时加入一个线程运算时可以使用join方法。

原文地址:https://www.cnblogs.com/pushudepu/p/6049215.html