2017-10-19 11 views
0

내 주 스레드에서 HttpURLConnection을 통해 서버에 데이터를 보내고 나서 timer을 시작하여 TimerTask를 주기적으로 실행하여 서버의 응답을 확인합니다. 예상되는 문자열을 얻을 때 나는 timer.cancel()이라고 부른다. 그런 다음 주 스레드는 timer이 시작된 곳에서 다시 시작합니다.주 스레드에 의해 호출 된 TimerTask 스레드가 끝날 때까지 주 스레드를 억제하는 방법?

난 그냥이 게시물에 대한 동일한 메커니즘 단순화 된 코드를 다음과 같은 상상 :

start 
abc 
abc 
abc 
end 

하지만 얻을 :

public class Test { 
    public static void main(String[] args) throws InterruptedException { 
     System.out.println("start"); 
     Timer timer = new Timer(); 
     TmTask timerTask = new TmTask(timer);  
     Thread thread = new Thread(timerTask,"thread_1"); 
     thread.start(); 
     thread.join();  
     System.out.println("end"); 
    } 
} 

class TmTask extends TimerTask{ 
    Timer t; 

    public TmTask(Timer t){ 
     this.t = t; 
    } 

    @Override 
    public void run() { 
     t.schedule(new A(t), 100, 1000); 

    } 
} 
class A extends TimerTask{ 
    private Timer t; 
    private int i = 0; 
    public A(Timer t) { 
     this.t = t; 
    } 
    @Override 
    public void run() { 
     System.out.println("abc"); 
     i++; 
     if (i == 3) t.cancel(); 
    } 
} 

내 expection가

start 
end 
abc 
abc 
abc 

마지막으로 내가 실현 내 코드에는 3 개의 쓰레드가 생성되었지만 2 (메인 쓰레드와 타이머 쓰레드)와 join() 메서드는 타이머 스레드 대신 thread_1이라는 스레드에서 작동합니다. 그러나 나는 그것을 향상시키는 방법을 모른다.

아무도 도와 줄 수 있습니까? 미리 감사드립니다.

+0

왜 다시 스레드를 사용 하시겠습니까? 메인 스레드에서 기다리고있을 때 메인 스레드에서 실행할 수 있습니다 ... – Lino

+0

이것은 스레드의 아이디어를 깨뜨릴 것입니다. 비동기 작업을 위해 스레드를 사용하려고합니다. 당신이하고 싶은 것은 그것이 다시 동기되도록 강제하는 것입니다. –

+0

TimerTask에 Timer에 대한 참조가 포함되어 있으면 안됩니다. 과제는 * 배경 작업입니다. 다른 배경 작업을 시작해서는 안됩니다. – VGR

답변

1

새 스레드를 만드는 목적은 병렬 스레드를 실행하기 위해 주 스레드와 별도로 시작하는 것입니다. timestask가 자체 스레드를 생성하기 때문에 3 개의 스레드가 있습니다. 당신이 당신의 현재 (주) 스레드가 다음 방금과 같은 작업을 수행 할 수 있습니다 중지하고 결과를 기다려야 할 경우

boolean result = false; 
while(! result) { 
result=checkForResult(); 
Thread.sleep(1000); 
} 

이 현재 스레드를 일시 정지하고 차단하게됩니다. 일반적으로 이러한 외부 작업 및 비동기 호출의 경우 주 스레드가 실행을 중지하고 결과를 얻지 못할지 모르기 때문에 대기하지 않아야하며 무기한 대기 할 수 있습니다. 그래서 아마도 당신의 결과가 원하는 것일까요? :)

+0

난 그냥 기다릴 멀리 전체 아이디어를 던져 제안하고, 그냥 메인 스레드에서 모든 것을 실행하거나 내가 잘못 생각하고있어? – Lino

+0

그래, 내가 말하려고하는거야. 주 스레드가 기다리고 싶다면 추가 스레드가 필요하지 않습니다. 스레드에 대한 아이디어는 메인 스레드와 병렬로 무언가를 실행하는 것입니다. –

+0

그러나 병렬로 실행하고 대기하지 않는 작업을 차단하는 것이 올바른 선택 일 수 있습니다. 그런 다음 그가 수행 한 작업이 옳고 그가 원하는 일이 잘못된 것입니다. –