내 주 스레드에서 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
이라는 스레드에서 작동합니다. 그러나 나는 그것을 향상시키는 방법을 모른다.
아무도 도와 줄 수 있습니까? 미리 감사드립니다.
왜 다시 스레드를 사용 하시겠습니까? 메인 스레드에서 기다리고있을 때 메인 스레드에서 실행할 수 있습니다 ... – Lino
이것은 스레드의 아이디어를 깨뜨릴 것입니다. 비동기 작업을 위해 스레드를 사용하려고합니다. 당신이하고 싶은 것은 그것이 다시 동기되도록 강제하는 것입니다. –
TimerTask에 Timer에 대한 참조가 포함되어 있으면 안됩니다. 과제는 * 배경 작업입니다. 다른 배경 작업을 시작해서는 안됩니다. – VGR