2012-12-16 5 views
-2

최소한의 낭비되는 신호로 2 개의 스레드간에 신호를 보내려는 시도. 내가 시도한 시간이 얼마 남지 않았으므로 오류/개선 사항을 제안하십시오. 의도는 다음과 같습니다. 1. 교착 상태가 없음 2. 읽을 때 업데이트가 누락되었습니다. 3. 가능한 한 누락 된 신호를 발생시키지 않습니다. 효과의 순서로자바 스레드 시그널링

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

IMHO 'while (true)'의 존재는이 코드가 최적이 아니라는 확실한 지표입니다. – mre

답변

1

제안 (또는 역 정신에 의해, 관점에 따라) :

  1. 정지 수동으로 스레드를 관리하려고하고 대신 배우 나 소프트웨어 트랜잭션처럼 동시성을 관리하기위한 입증 된 패러다임을 사용 당신의 필요에 맞는 기억.
  2. 동시성을 처리 할 때 가변 상태를 사용하지 마십시오.
  3. 변경할 수있는 상태를 사용해야하는 경우 최소한 공유 가능한 상태를 사용하지 마십시오.

추가 제안 : Brian Goetz의 "Java Concurrency in Practice"을 읽으면 일반적인 응용 프로그램에서이 수준의 코드를 작성해서는 안됩니다.