在java多线程中,线程的交互十分重要,而java也自带了一些库函数用于进行线程的交互,而wait(),notify()就十分重要,那么我们应该如何正确使用wait()和notify()呢?
1.我们应该在同一个类方法里面同时使用这2个方法,把这2个类的方法交给类来监管,为什么呢?wait()顾名思义,等待,它会把自身的线程挂起来,等同一个监管者发起notify(),或者allnotify()时再继续执行,所以说如果这2个方法不在同一个类里面,给同一个监管器监管,那么就大大增加了代码的难度。
import javax.naming.ldap.PagedResultsControl;
class h{
synchronized void f1() throws InterruptedException {
int c = 1;
System.out.println(11);
while(c <= 5)
System.out.println(c++);
wait();
System.out.println(111);
}
synchronized void f2()
{
System.out.println(2);
notify();
}
}
public class hello {
public static void main(String[] args)
{
h H = new h();
Runnable runnable1 = ()->{
try {
H.f1();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
Runnable runnable2 = ()->{
H.f2();
};
Thread thread1 = new Thread(runnable1);
Thread thread2 = new Thread(runnable2);
thread1.start();
thread2.start();
}
}
结果:
11
1
2
3
4
5
2
111
2.sleep()和wait()的区别是什么呢?
sleep()是Thread()类中的函数,wait()是java自带的object函数,前者挂起时并不会交出锁,意味着它的挂起只是单纯的挂起,其他线程并不能进入相同监管器的代码,而wait()他会交出锁,其他线程也可以进去相应代码段。
3.wait()执行后,接收到notify()后代码是重新执行还是在wait()后面继续执行?
答案是后者,看我给的样例结果就知道了