A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jonn 高级黑马   /  2013-1-19 13:35  /  1831 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-19 14:54 编辑
  1. class User
  2. {
  3.         private String name;
  4.         private float pay;
  5.         protected void setName(String name){
  6.                 this.name=name;
  7.         }
  8.         protected String getName(){
  9.                 return this.name;
  10.         }
  11.         protected void setPay(float pay){
  12.                 this.pay=pay;
  13.         }
  14.         protected float getPay(){
  15.                 return this.pay;
  16.         }
  17.         public boolean flag=false;
  18. }
  19. class AOper implements Runnable
  20. {
  21.         private User user;
  22.         AOper(User user){
  23.                 this.user=user;
  24.         }
  25.         public void run(){
  26.                
  27.                         while(true)
  28.                         {
  29.                          int i=0;
  30.                      synchronized(user){
  31.                                 if(user.flag)
  32.                                  try{user.wait();}catch(Exception e){}
  33.                                          if(i==0){
  34.                                            user.setName("zk");
  35.                                            user.setPay(9000f);
  36.                                           }else{
  37.                                                 user.setName("lii");
  38.                                                 user.setPay(12000f);
  39.                                           }
  40.                                   i=(i+1)%2;        
  41.                                   user.flag=true;
  42.                                   user.notify();
  43.                                 }
  44.                 }
  45.         }
  46. }
  47. class BOper implements Runnable
  48. {
  49.         private User user;
  50.         BOper(User user){
  51.                 this.user=user;
  52.         }
  53.         public void run(){
  54.                 synchronized(user){
  55.                         if(!user.flag)
  56.                            try{user.wait();}catch(Exception e){}
  57.                System.out.println("name:"+user.getName()+"--pay:"+user.getPay());
  58.                            user.flag=false;
  59.                            user.notify();
  60.                 }
  61.         }
  62. }
  63. class  UserTest
  64. {
  65.         public static void main(String[] args)
  66.         {
  67.                 User user=new User();
  68.                 AOper a=new AOper(user);
  69.                 BOper b=new BOper(user);
  70.         Thread t1=new Thread(a);
  71.                 Thread t2=new Thread(b);
  72.                 t1.start();
  73.                 t2.start();
  74.         }
  75. }   // 执行程序后一直等待.....成了死锁,怎么改呢?
复制代码

点评

文哥不给力啊 这个问题很容易解决哦 这个也不是死锁  发表于 2013-1-19 14:52

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
本帖最后由 唐晓 于 2013-1-19 14:14 编辑

BOper 类的run方法里加一个while(true),让他永久的运行,不然BOper类运行完一次后会挂那了
回复 使用道具 举报
为啥要搞锁的嵌套呢,想让两线程到一种和谐状态时及其不易的,开发中躲还来不及呢,
死锁的原因:出现了嵌套锁,一个线程进入了另一进不去,不会去执行,到最后两个线程都进行不了
程序就挂了
回复 使用道具 举报
同学你好,下面是我修改你的代码后的结果,里面有注释解释一些地方进行的改变
  1. class User
  2. {
  3.         private String name;
  4.         private float pay;
  5.         protected void setName(String name){
  6.                 this.name=name;
  7.         }
  8.         protected String getName(){
  9.                 return this.name;
  10.         }
  11.         protected void setPay(float pay){
  12.                 this.pay=pay;
  13.         }
  14.         protected float getPay(){
  15.                 return this.pay;
  16.         }
  17.         public boolean flag=false;
  18. }
  19. class AOper implements Runnable
  20. {
  21.         private User user;
  22.         AOper(User user){
  23.                 this.user=user;
  24.         }
  25.         public void run(){
  26.                 int i=0;          //这里应该把标记放在while(true)的外面,否则,i每次又都会等于0,else就执行不到
  27.                         while(true)
  28.                         {
  29.                         
  30.                      synchronized(user){
  31.                                 if(user.flag)
  32.                                  try{user.wait();}catch(Exception e){}
  33.                                          if(i==0){
  34.                                            user.setName("zk");
  35.                                            user.setPay(9000f);
  36.                                           }else{
  37.                                                 user.setName("lii");
  38.                                                 user.setPay(12000f);
  39.                                           }
  40.                                   i=(i+1)%2;        
  41.                                   user.flag=true;
  42.                                   user.notify();
  43.                                 }
  44.                 }
  45.         }
  46. }
  47. class BOper implements Runnable
  48. {
  49.         private User user;
  50.         BOper(User user){
  51.                 this.user=user;
  52.         }
  53.         public void run(){
  54.                 synchronized(user){
  55.                         while(true){                  //这里也需要使用while(true),之前是因为它只执行了一次
  56.                         if(!user.flag)
  57.                            try{user.wait();}catch(Exception e){}
  58.                System.out.println("name:"+user.getName()+"--pay:"+user.getPay());
  59.                            user.flag=false;
  60.                            user.notify();
  61.                 }
  62.                 }
  63.         }
  64. }
  65. class  UserTest
  66. {
  67.         public static void main(String[] args)
  68.         {
  69.                 User user=new User();
  70.                 AOper a=new AOper(user);
  71.                 BOper b=new BOper(user);
  72.         Thread t1=new Thread(a);
  73.                 Thread t2=new Thread(b);
  74.                 t1.start();
  75.                 t2.start();
  76.         }
  77. }   // 执行程序后一直等待.....成了死锁,怎么改呢?
复制代码

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 很给力!

查看全部评分

回复 使用道具 举报
辉哥,不是不给力,没事发发滴{:soso_e141:},我这一般用Lock接口实现多线程
回复 使用道具 举报
赵文 发表于 2013-1-19 19:27
辉哥,不是不给力,没事发发滴,我这一般用Lock接口实现多线程

{:3_69:}{:3_48:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马