线程的通信(以使用两个线程交替打印1-100为例)
1.线程的通信:线程之间的交流,其实也就是几个方法的使用。
示例:创建两个线程,使得线程1和线程2交替打印出1-100
代码如下(示例):
class Num implements Runnable{
private int number = 1;
@Override
public void run() {
while (true){
synchronized (this) {
notifyAll();
if (number <= 100){
System.out.println(Thread.currentThread().getName() + ":" +number);
number++;
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
break;
}
}
}
}
}
class ConmmunicationTest {
public static void main(String[] args) {
Num num = new Num();
Thread t1 = new Thread(num);
Thread t2 = new Thread(num);
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
2.结果的展示
结果如下(示例):
3.方法的介绍
- wait():使当前线程处于阻塞状态,并释放锁
- notify():唤醒被wait的一个线程,如果多个线程被wait了,唤醒优先级比较高的那个
- notifyAll():唤醒所有被wait()的线程
注意:这三个方法必须使用在同步代码块或者同步方法中,三个方法都定义在java.long.Obiect类中
4.经典面试题
sleep()和wait()的异同?
相同点:
- 都可以使线程进入阻塞状态
不同点:
- sleep()声明在Thread类中,wait()声明在Object类中
- sleep()可以在任何地方使用,wait()只能在同步代码块或者同步方法中使用
- sleep()不会释放锁,wait()会释放锁
synchronized和lock的异同?
相同点:
- 都可以用来解决线程安全问题
不同点:
- lock需要手动的拿锁[lock()]和解锁 [unlock()],而synchronized执行完代码块后自动的释放锁