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

时间:2017-10-19 12:31:54

标签: java multithreading timertask

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

我想在这篇文章中使用相同机制的简化代码:

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(主线程和Timer线程),join()方法在名为thread_1的线程上工作而不是定时器线。但我不知道如何改进它。

任何人都可以帮助我吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

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