2017-12-13 15 views
1

다음과 같이 가정 해 봅시다 :시간 제한 기능

function requestValue :이 함수를 여러 번 호출해야합니다. 내가 호출 할 때마다, 어떤 값을 계산해야한다. X 그런 다음 계산 된 값을 매개 변수로 사용하여 다른 함수 submitValue(X)을 호출해야한다. 그러나 5 초 이내에 계산이 완료되지 않으면 submitValue(-1)을 호출해야합니다.

이것은 가능한 한 간단하게 질문을하기 위해 필요한 것의 예제이며, 함수는 아무 것도 계산하지 않습니다 (수면 시간 제한을 시뮬레이션하는 데 사용됨). 내가 무슨 짓을

는 스레드 클래스를 확장하고, 중지로 스레드를 표시하는 기능을 추가 :

void requestValue(){ 
    myThread thread = new myThread(); 

    Timer myTimer = new Timer(1000 , new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       thread.Stop(); 
       submitValue(-1); 
      } 
     }  
    ); 
    myTimer.setRepeats(false); 
    myTimer.start(); 
    thread.start(); 
} 

submitValue 기능 현재 단지 인쇄 :

여기
class myThread extends Thread{ 
    boolean stop = false; 
    @Override 
    public void run(){ 
     Random rand = new Random(); 
     try { 
      Thread.sleep(200*rand.nextInt(10)); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(myClass.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     if (stop == false) 
      submitValue(1); 
    } 
    void Stop(){ 
     stop = true; 
    } 
} 

requestValue 기능입니다 (1 또는 -1).

이렇게하면 제한 시간이 초과되면 submitValue(1) 함수가 호출되지 않지만 submitValue(-1)은 항상 호출됩니다. 청취자에게 submitValue(1)이 호출되었거나 다시 호출되지 않는다는 것을 어떻게 알릴 수 있습니까? 그리고 내가 사용하는 방식보다 더 나은 방법이 있을까요?

또 다른 문제는 모든 -1이 나타나기 전에 모든 1이 인쇄되고 있다는 것입니다. 그 이유는 무엇입니까?

감사합니다.

답변

2

몇 가지. 첫째, 스레드를 확장하지 마십시오. 원한다면 익명으로 수행 할 수있는 Runnable을 구현하고이를 Thread 생성자에 전달하십시오.

둘째, 두 번째 타이머 스레드를 만들지 마십시오. 그것은 지나치게 복잡하고 아마도 문제의 근원입니다. 대신 메인 스레드가 차단되도록하십시오.

시간 제한을 설정하려면 Thread.join (long millis)을 사용하십시오. 스레드가 여전히 활성화되어 있으면 "중지"플래그를 설정합니다. (휘발성 키워드는 변경 될 때 worker 스레드가 값을 볼 수 있도록합니다.) -1을 반환합니다. 그렇지 않으면 계산 된 값을 반환합니다.