线程间通讯:
多个线程在处理同一资源,但是任务却不同。
多生产者,多消费者的问题:
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方法。