在我的主线程中,我通过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
的线程上工作而不是定时器线。但我不知道如何改进它。
任何人都可以帮助我吗?提前谢谢。
答案 0 :(得分:1)
创建新线程的全部目的是与主线程分开启动 - 以获得并行执行。你有3个线程因为timertask创建了自己的线程。如果您希望当前(主)线程停止并等待结果,那么您可以执行以下操作:
boolean result = false;
while( ! result ) {
result=checkForResult();
Thread.sleep(1000);
}
这将暂停当前线程并导致其阻塞。通常对于此类外部任务和异步调用,您不希望主线程停止执行并等待,因为您不知道何时会得到结果并且可能无限期地等待。那么你的结果可能是理想的结果呢? :)