2017-10-24 18 views
0

클라이언트에는 일정 간격으로 알람을 예약하는 Scheduler 클래스가 제공됩니다. 이렇게하려면 우선 순위 대기열에 알람을 추가하는 클래스에 setAlarm 메서드가 있고 Timer 프로 시저가 대기열의 맨 위에있는 프로세스를 깨우고 처리 할 시간을 알 수 있도록 notify()을 수행합니다.어떻게 여러 스레드가 인스턴스에 대한 참조를 유지할 수 있습니까?

다음은 기본 구현 - 이제

class Scheduler { 

    synchronized public void setAlarm(Date date) { 
     notify(); 
    } 

    synchronized private void alarmTimer() { 
     while (true) { 
      wait(); 
      System.out.println("Alarm Triggered"); 
     } 
    } 

이 알림을 수신하거나 시간이 다 될 때까지 때까지이 기다리고있을 것입니다 때문에 내가 다른 스레드에서 실행하는 Timer 절차를 필요의 예입니다. 그러나 클라이언트는 두 개의 스레드가 있음을 인식하지 못합니다. 고객의 관점에서라면 schedulerInstance.setAlarm(myDate)을 처리 할 것이므로 처리해야합니다.

따라서 ScheduleralarmTimer()에 대해 별도의 스레드를 만들어야합니다. this 객체를 계속 참조하면서이 새 스레드에서 alarmTimer를 호출하는 방법은 무엇입니까? wait()notify()이 작동하도록 원래의 Scheduler 인스턴스에 대한 참조를 유지하기 위해 여러 스레드가 원하는 상황을 처리하는 올바른 방법은 무엇입니까?

+2

Java 5 이후로 ['ScheduledExecutorService'] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html)가 있습니다. 직업에 사용. – alfasin

답변

0

이 하나 개의 방법이 될 것입니다 ... 오히려

  • this에 대한 참조를 유지 스레드 &을 시작 메소드 레벨에보다 this

    1. 확장 스레드
    2. 동기화

    class Scheduler extends java.lang.Thread { 
    
        public void setAlarm(Date date) { 
        synchronized(this) { 
         this.notify(); 
        } 
        } 
    
        private void alarmTimer() { 
        this.start(); 
        } 
    
        @Override 
        public void run() { 
        synchronized(this) { 
         while (true) { 
         this.wait(); 
         System.out.println("Alarm Triggered"); 
         } 
        } 
        } 
    } 
    

    다른 모든 접근법은 생각할 수 있습니다. 알람 시작 & 사이에서 대기중인 객체에 대한 참조를 유지할 수 있습니다. (anyObject.wait()anyObject.notify())

  • +0

    Thread를 확장하는 것은 나쁜 습관이 아닙니까? ThreadPoolExecutor를 사용하는 권장 방법이 아닌가요? – sbhatla

    +0

    @sbhatla : 아니, "나쁘지 않은 습관"(.. 실을 확장하기 위해 ... 이후 많은 튜토리얼/학교에서 가르쳐). 'ThreadPoolExecutor'는 확장 스레드와 충돌하지 않지만, (여러) 스레드를 실행하고 관리하기위한 (적절한) "컨테이너"입니다. – xerx593