基础视频中线程通信那个代码好像与卤煮的问题相似,不知能不能帮到卤煮消除疑惑。
wait()方法:该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。需要注意的是wait()方法被线程被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中。比如:- synchronized (r) //r是锁
- {
- if(!r.flag)
- try {
- r.wait();
- } catch (InterruptedException e) {
- throw new RuntimeException("Output Got it");
- }
- System.out.println(r.name+"+++"+r.gender);
- r.flag = false;
- r.notify();//唤醒对方线程
- }
复制代码 当然,使用interrupt方法也会打断线程的暂停状态,可以对wait中的线程传达"不用等notify/notifyAll了,从等待中出来"的信号.但是当线程wait时,有一点需要注意的,那就是锁的问题.线程进入等待状态时,会将自己拥有的锁释放,当对wait中的线程调用interrupt方法是,等待线程会重新获取锁,然后再抛出interruptedException.获取锁定之前,并无法抛出InterruptedException异常. 比如当线程t调用interrupt方法是,线程代码块中会检测出中断异常,并马上抛出。- t.start();
- t.interrupt();
复制代码 当中断方法执行后,参照第一段代码:则会出现以下的异常信息:- <font color="#ff0000">Exception in thread "Thread-0" java.lang.RuntimeException: Input Got it
- at com.intel.thread.Input.run(ThreadCommunication.java:39)
- at java.lang.Thread.run(Thread.java:619)</font>
- AAA+++male
复制代码 |