为了账号安全,请及时绑定邮箱和手机立即绑定

关于java多线程中的await和signalAll的使用问题

关于java多线程中的await和signalAll的使用问题

繁花不似锦 2018-12-07 05:24:54
package test.synchornize; import java.util.concurrent.locks.*; class runab implements Runnable{ boolean x = true; static Lock lock = new ReentrantLock(); static Condition con1 = lock.newCondition(); static Condition con2 = lock.newCondition(); runab(boolean x){  this.x = x; } public void run() {  lock.lock();  try {   System.out.println("Start---" + Thread.currentThread().getName());   if(x) {    x = false;    try {con1.await();con2.await();} catch (InterruptedException e) {}   }   System.out.println("End---" + Thread.currentThread().getName());  } finally {    con2.signalAll();   con1.signalAll();   lock.unlock();  } }} public class showLock {  public static void main(String[] args) {  runab rab = new runab(true);  runab rab1 = new runab(false);  Thread th = new Thread(rab);  Thread th1 = new Thread(rab1);  th.start();  try {   Thread.sleep(100);  } catch (InterruptedException e) {   // TODO Auto-generated catch block   e.printStackTrace();  }  th1.start();   } }   请问finally里面怎样写才能,让线程th继续下去呢?(即让程序最后一行输出 “End---Thread-0”)
查看完整描述

1 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

呵,你这怎么写线程th都执行不下去啊,自己把自己锁死了。con1.await()和con2.await()是释放锁,线程进入阻塞状态并等待其他线程唤醒,finally根本就不会执行,那必然不会唤醒。你这con1和con2就不应该是对象内的局部变量,应该是线程间的共享变量,才能在自己等待的时候,被其他线程唤醒。

查看完整回答
反对 回复 2018-12-16
  • 1 回答
  • 0 关注
  • 975 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信