2012-12-16 128 views
-2

尝试在两个线程之间以最小浪费信号发送信号。 既然已经有一段时间我尝试过了 - 请提出错误/改进建议(如果有的话)。 意向为: 1.no死锁 2.no更新被错过读取 3.尽量不提高错过的信号。在效力的顺序java线程信号发送

import java.util.Random; 
class shareful{ 

    class share{ 
     int sharedata; 
     volatile boolean isbitset=false; 
     public int getstats(){ 
      return sharedata; 
     } 
     public void setstats(int data){ 
      sharedata=data; 
     } 

     public boolean getbitset(){ return isbitset;} 
     public void setbitset(boolean flag){ isbitset=flag;} 
    } 
    share so=new share(); 
    void runStatistics(){ 
     int check=0; 
     Thread t1=new Thread(new Runnable(){ 
      public void run(){ 
       Random r=new Random(); 
       boolean isflagged=false; 
       while (true){ 
        synchronized(so){ 
         try{ 
          while(so.getbitset()==true){ 
             so.wait(); 
          } 
         } 
         catch(InterruptedException e){} 
         so.setstats(r.nextInt(200)); 
         if(so.getbitset()==false) isflagged=true; 
         so.setbitset(true); 
         if(isflagged) so.notify(); 

        } 
       } 


      } 
     }); 

     Thread t2=new Thread(new Runnable(){ 
      public void run(){ 
       boolean isflagged=false; 
       while(true){ 
        synchronized(so){ 
          try{ 
            while(so.getbitset()==false){ 
            so.wait(); 
           } 
          } 
          catch(InterruptedException e){} 
          int curr=so.getstats(); 
          if(so.getbitset()==true) isflagged=true; 
          so.setbitset(false); 
          if(isflagged) so.notify(); 
        } 

       } 
      } 
     }); 

     t1.start(); 
     t2.start(); 


    } 

    public static void main(String[] args){ 
     shareful s=new shareful(); 
     s.runStatistics(); 
    } 


} 
+4

如果你的代码确实在工作,你可能想看看http://codereview.stackexchange.com/ –

+0

代码正在工作(没有死锁) - 并且据我所知,只有一个浪费的信号但不知道这是否是最佳选择。 – IUnknown

+1

恕我直言,“while(true)”的存在是一个明确的指示器,表明此代码不是最优的。 – mre

回答

1

建议(或反理智,取决于你的观点):

  1. 停止尝试手动管理线程,而是使用经过验证的模式来管理并发喜欢的演员或软件事务内存取决于什么适合您的需求。
  2. 处理并发时不要使用可变状态。
  3. 如果您必须使用可变状态,至少不要使用任何共享可变状态。

其他建议:阅读布赖恩戈茨”‘Java Concurrency in Practice’地发现,你不应该试图在这个级别中的典型应用编写代码。