2013-02-10 3 views
0

util.concurrent 패키지가없는 디지털 시계 인 잠자기, 알림, 대기를 사용하여 아래 코드를 확인하십시오. 코드가 올바르게 실행되고 있으면 더 좋은 방법을 제안하십시오. 덕분에수면 전용 멀티 스레딩이있는 디지털 시계

/** 
* 
*/ 
package com.nagihome.clock; 

/** 
* @author Nagi 
* 
*/ 
public class ThreadAlarmClock { 

    private static Integer hours = 23; 
    private static Integer minutes = 59; 
    private static Integer seconds = 55; 
    private static Integer minSecLastNum = 60; 
    private static Integer hour24LastNum = 24; 
    private static String COLON = ":"; 
    private static Boolean isMinUpdatable = false; 
    private static Boolean isHourUpdatable = false; 
    final static Object lock = new Object(); 

    public void updateSeconds() throws InterruptedException { 

     synchronized (lock) { 
      while (true) { 
       if (isMinUpdatable || isHourUpdatable) { 
        lock.wait(); 
       } else { 
        Thread.sleep(1000); 
        seconds++; 
        if (seconds.equals(minSecLastNum)) { 
         seconds = 0; 
         isMinUpdatable = true; 
         lock.notifyAll(); 
        } else { 
         displayTime(); 
        } 
       } 
      } 
     } 
    } 

    public void updateMinutes() throws InterruptedException { 

     synchronized (lock) { 
      while (true) { 
       if (!isMinUpdatable) { 
        lock.wait(); 
       } else if (isMinUpdatable) { 
        minutes++; 
        isMinUpdatable = false; 
        if (minutes.equals(minSecLastNum)) { 
         minutes = 0; 
         isHourUpdatable = true; 
        } else { 
         displayTime(); 
        } 
       } 

       lock.notifyAll(); 
      } 
     } 
    } 

    public void updateHours() throws InterruptedException { 

     synchronized (lock) { 
      while (true) { 
       if (!isHourUpdatable) { 
        lock.wait(); 
       } else if (isHourUpdatable) { 
        hours++; 
        isHourUpdatable = false; 
        if (hours.equals(hour24LastNum)) { 
         hours = 0; 
        } 

        displayTime(); 
       } 

       lock.notifyAll(); 
      } 
     } 
    } 

    public void displayTime() { 
     System.out.println(hours + COLON + minutes + COLON + seconds); 
    } 

} 


/** 
* 
*/ 
package com.nagihome.clock; 

/** 
* @author Nagi 
* 
*/ 
public class SecondsThread implements Runnable { 

    private ThreadAlarmClock clock; 

    public SecondsThread(ThreadAlarmClock clock) { 
     this.clock = clock; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.lang.Runnable#run() 
    */ 
    @Override 
    public void run() { 
     try { 
      clock.updateSeconds(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 


/** 
* 
*/ 
package com.nagihome.clock; 

/** 
* @author Nagi 
* 
*/ 
public class MinutesThread implements Runnable { 

    private ThreadAlarmClock clock; 

    public MinutesThread(ThreadAlarmClock clock) { 
     this.clock = clock; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.lang.Runnable#run() 
    */ 
    @Override 
    public void run() { 
     try { 
      clock.updateMinutes(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 


/** 
* 
*/ 
package com.nagihome.clock; 

/** 
* @author Nagi 
* 
*/ 
public class HoursThread implements Runnable { 

    private ThreadAlarmClock clock; 

    public HoursThread(ThreadAlarmClock clock) { 
     this.clock = clock; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.lang.Runnable#run() 
    */ 
    @Override 
    public void run() { 
     try { 
      clock.updateHours(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 


/** 
* 
*/ 
package com.nagihome.main; 

import com.nagihome.clock.HoursThread; 
import com.nagihome.clock.MinutesThread; 
import com.nagihome.clock.SecondsThread; 
import com.nagihome.clock.ThreadAlarmClock; 

/** 
* @author Nagi 
* 
*/ 
public class Main { 

    /** 
    * @param args 
    * @throws InterruptedException 
    */ 
    public static void main(String[] args) throws InterruptedException { 
     ThreadAlarmClock clock = new ThreadAlarmClock(); 

     new Thread(new SecondsThread(clock)).start(); 
     new Thread(new MinutesThread(clock)).start(); 
     new Thread(new HoursThread(clock)).start();   
    } 

} 

답변

0

제안 alot을 :

  • 사용 내부적하지 초, 계산 밀리 초 ++
  • 잠 (1000) exatcly 1000 밀리 잠을하지 않는 것이 990 '또는 1110을 그렇게 할 수있다 깨어 난 후 시스템 시간 (또는 나노 시간)을 확인하고 마지막 웨이크 업 시간과의 차이를 계산하십시오. 예를 들어 1010 밀리미터를 잤다 고 감지하면 다음에 990 밀리미터 밖에 자지 않습니다.