/**
* 线程通信的例子:使用两个线程打印 1-100.线程1,线程2交替打印
*
* 涉及到的三个方法:
* wait():线程阻塞,并释放锁
* notify():唤醒一个阻塞的线程
* notifyAll():唤醒所有被阻塞的线程
*
* 注意:
* 这三个方法只能在同步代码块或者同步方法中使用
* 线程锁必须和调用这三个方法的对象相同,否则会出现异常 IllegalMonitorStateException
*
* 面试题:sleep()和wait()的区别
* 相同点:一旦执行方法,都可以让当前线程进入阻塞状态
* 不同点
* 1.sleep声明在Thread类中,wait()声明在Object方法中
* 2.sleep可以在任何位置调用,wait只能在同步方法或同步代码块中调用
* 3.在阻塞的状态时,sleep不释放锁,wait释放锁
*
* @author: qyx
* @date: 2022-07-23 22:07
* @desc:
*/
class Number implements Runnable{
private int number = 1;
@Override
public void run() {
while (true){
synchronized (this){
notify();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if(number <= 100){
System.out.println(Thread.currentThread().getName() + ":" + number++);
try {
//使得调用如下wait方法的线程进入阻塞状态
wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}else break;
}
}
}
}
public class CommunicationTest {
public static void main(String[] args) {
Number num = new Number();
Thread t1 = new Thread(num);
Thread t2 = new Thread(num);
t1.setName("线程一");
t2.setName("线程二");
t1.start();
t2.start();
}
}
/**
* 线程通信的例子:使用两个线程打印 1-100.线程1,线程2交替打印
*
* 涉及到的三个方法:
* wait():线程阻塞,并释放锁
* notify():唤醒一个阻塞的线程
* notifyAll():唤醒所有被阻塞的线程
*
* 注意:
* 这三个方法只能在同步代码块或者同步方法中使用
* 线程锁必须和调用这三个方法的对象相同,否则会出现异常 IllegalMonitorStateException
*
* 面试题:sleep()和wait()的区别
* 相同点:一旦执行方法,都可以让当前线程进入阻塞状态
* 不同点
* 1.sleep声明在Thread类中,wait()声明在Object方法中
* 2.sleep可以在任何位置调用,wait只能在同步方法或同步代码块中调用
* 3.在阻塞的状态时,sleep不释放锁,wait释放锁
*
* @author: qyx
* @date: 2022-07-23 22:07
* @desc:
*/
class Number implements Runnable{
private int number = 1;
@Override
public void run() {
while (true){
synchronized (this){
notify();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if(number <= 100){
System.out.println(Thread.currentThread().getName() + ":" + number++);
try {
//使得调用如下wait方法的线程进入阻塞状态
wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}else break;
}
}
}
}
public class CommunicationTest {
public static void main(String[] args) {
Number num = new Number();
Thread t1 = new Thread(num);
Thread t2 = new Thread(num);
t1.setName("线程一");
t2.setName("线程二");
t1.start();
t2.start();
}
}