public class TestWatiNotify {
public static Object obj = new Object();
public static void main(String[] args) {
Thread1 t1 = new Thread1();
t1.setName("线程1");
Thread2 t2 = new Thread2();
t2.setName("线程2");
t1.start();
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
t2.start();
}
static class Thread1 extends Thread {
@Override
public void run() {
synchronized (obj) {
System.out.println("调用wait方法前");
try {
//wait方法将当前线程置入休眠状态,知道被通知或中断为止,
// 在调用wait()方法前,必须获取对象级别锁,因此它只能在同步方法和同步块调用。
// 当调用wait()方法,当前线程释放锁,在从wait()方法返回前,线程与其他线程竞争重新获得锁。
obj.wait();// 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName()
+ "获取到锁");
}
}
}
static class Thread2 extends Thread {
@Override
public void run() {
synchronized (obj) {
// 该方法也要在同步方法和同步块中调用,在调用前必须获得对象级别锁,没有则抛出异常。
// 该方法用来通知那些等待该对象的对象锁的其他线程,如果有多个线程等待,
// 则挑选出一个其中出于wait状态的线程来发出通知,
// 并使得它获取对象锁。(执行notify方法后,当前线程并不会马上释放该对象锁,
// 要等到程序退出synchronized代码块后,当前线程才可以释放对象锁,
// 处于wait状态的线程才可以获取该对象锁)
obj.notify();// 唤醒在此对象监视器上等待的单个线程。
System.out.println("线程" + Thread.currentThread().getName()
+ "调用了notify方法");
}
System.out.println("线程" + Thread.currentThread().getName()
+ "释放了该锁");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName() + "结束");
}
}
}
public static Object obj = new Object();
public static void main(String[] args) {
Thread1 t1 = new Thread1();
t1.setName("线程1");
Thread2 t2 = new Thread2();
t2.setName("线程2");
t1.start();
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
t2.start();
}
static class Thread1 extends Thread {
@Override
public void run() {
synchronized (obj) {
System.out.println("调用wait方法前");
try {
//wait方法将当前线程置入休眠状态,知道被通知或中断为止,
// 在调用wait()方法前,必须获取对象级别锁,因此它只能在同步方法和同步块调用。
// 当调用wait()方法,当前线程释放锁,在从wait()方法返回前,线程与其他线程竞争重新获得锁。
obj.wait();// 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName()
+ "获取到锁");
}
}
}
static class Thread2 extends Thread {
@Override
public void run() {
synchronized (obj) {
// 该方法也要在同步方法和同步块中调用,在调用前必须获得对象级别锁,没有则抛出异常。
// 该方法用来通知那些等待该对象的对象锁的其他线程,如果有多个线程等待,
// 则挑选出一个其中出于wait状态的线程来发出通知,
// 并使得它获取对象锁。(执行notify方法后,当前线程并不会马上释放该对象锁,
// 要等到程序退出synchronized代码块后,当前线程才可以释放对象锁,
// 处于wait状态的线程才可以获取该对象锁)
obj.notify();// 唤醒在此对象监视器上等待的单个线程。
System.out.println("线程" + Thread.currentThread().getName()
+ "调用了notify方法");
}
System.out.println("线程" + Thread.currentThread().getName()
+ "释放了该锁");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName() + "结束");
}
}
}