java 线程 基础笔记2

线程间通讯:

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

 等待/唤醒机制

涉及的方法:

1.wait(); 让线程处于冻结状态,被wait的线程会被存储到线程池中。

2.notify();唤醒线程池中的一个线程(任意)。

3.notifyaAll();唤醒线程池中的所有线程。

这些方法都必须定义在同步中,因为这些方法是用于操作线程状态的方法。

必须要明确操作的是哪个锁上的线程。

为什么操作线程的方法 wait  notify notifyAll 定义在了Object类中??

因为这些方法是监视器的方法,监视器其实就是锁。

锁可以是任意的对象,任意的对象调用的方式一定定义在Object类中。

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

Lock接口:替代了同步代码块或者同步函数,将同步的隐式锁操作变成现实锁操作。

同时更为灵活,可以一个锁上加多组监视器。

lock();获取锁

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

Condition接口:出现代替了Object中的wait,notify,notifyAll方法。

将这些监视器方法单独进行了封装,变成Condition监视器对象。

可以任意锁进行组合。

await();

signal();

signalAll();

wait 和 sleep 区别?

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

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

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

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

停止线程:

1.stop方法

不安全,已过时。

2.run方法结束

可以使用interrupt()方法可以将线程从冻结状态强制恢复到运行状态中来,让线程具备CPU的执行资格。

当时强制动作会发生InterruptedException,需要处理

原文地址:https://www.cnblogs.com/wangxh92/p/3684240.html