我有一个小问题,我似乎无法做对。我在java中有以下类:
package pooledtcpconnector.utilities;
import java.io.IOException;
import java.io.InputStream;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
public final class Notifier implements Runnable {
private final ILogger logger;
private Timer mTimer;
private final int Treshold;
private final InputStream ResponseStream;
private final TimerTask DoWaitTask;
public Notifier(final InputStream _ResponseStream, final Integer _Treshold, final ILogger logger) {
this.logger = logger;
mTimer = new Timer();
this.ResponseStream = _ResponseStream;
this.Treshold = _Treshold;
DoWaitTask = new TimerTask() {
@Override
public void run() {
try {
int mSize = ResponseStream.available();
if (mSize >= Treshold) {
mTimer.cancel();
}
} catch (final IOException ex) {
final String ExceptionMessage = ex.getMessage();
logger.LogMessage(
this.getClass().getCanonicalName(),
"Notifier.DoWaitTask:run.ResponseStream.available",
ex.getClass().getCanonicalName(),
new String[]{
ExceptionMessage,
"Parameters:",
String.format("-"),
});
Logger.getLogger(Notifier.class.getCanonicalName()).log(Level.FINE, ex.getMessage(), ex.getCause());
}
}
};
}
@Override
public void run() {
synchronized (this) {
mTimer.scheduleAtFixedRate(DoWaitTask, 250, 200);
// Notification mechanism
notify();
}
}
}
除非可用方法至少返回Treshold,否则此类将确保我们的应用程序不会开始处理SocketInputStream。然而问题是,一旦我用计时器安排DoWaitTask,它就会运行永恒。通过取消计时器,任务仍然运行并且整个应用程序挂起,但更重要的是,一旦它已经被处理和关闭,它就会尝试在流上调用available。当然,这会产生一个很好的IOException:流关闭。
如何与计时器一起停止计划任务? timer.cancel显然还不够。
此致 乔伊
答案 0 :(得分:1)
在计时器任务的run()方法中使用TimerTask.cancel()。根据Javadoc的方法:
请注意,从a的run方法中调用此方法 重复计时器任务绝对保证计时器任务将 不要再跑了。
答案 1 :(得分:0)
私人计时器reportTimer = null;
if (reportTimer != null) {
reportTimer.cancel();
reportTimer = null;
}
reportTimer = new Timer();
reportTimer.schedule(new TimerTask() {}