如何在主线程调用的 TimerTask 线程完成之前抑制主线程?

How to suppress main thread until a TimerTask thread which is invoked by main thread is finished?

在我的主线程中,我通过 HttpURLConnection 向服务器发送一些数据,然后我启动一个 timer 以定期执行 TimerTask 以检查服务器的响应。当我得到预期的字符串时,我调用 timer.cancel()。此后,主线程从 timer 开始的地方恢复。

我想象以下使用相同机制的简化代码只是为了这个 post:

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();
    }   
}

我的期望是:

start
abc
abc
abc
end

但我得到:

start
end
abc
abc
abc

最后我意识到在我的代码中创建了 3 个线程,但我期望有 2 个(主线程和计时器线程),并且 join() 方法在名为 thread_1 的线程上工作,而不是定时器线程。但是我不知道如何改进它。

谁能帮帮我?提前致谢。

创建新线程的全部目的是将其与主线程分开启动 - 以并行执行。你有 3 个线程,因为 timertask 创建了自己的线程。如果您希望当前(主)线程停止并等待结果,那么您可以执行以下操作:

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

这将暂停当前线程并使其阻塞。通常对于这样的外部任务和异步调用,你不希望主线程停止执行并等待,因为你不知道什么时候会得到结果,它可能会无限期地等待。那么您的结果可能是您想要的吗? :)