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