如何取消已安排的TimerTask?
我有一个小问题,我似乎无法做正确的事情。 我在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();
        }
    }
}
这个类将确保我们的应用程序不会开始处理SocketInputStream,除非可用的方法返回至少Treshold。 然而,问题在于,一旦我使用Timer计划DoWaitTask,它就会永久运行。 通过取消定时器,任务仍然运行,整个应用程序将挂起,但更重要的是,它会尝试在流已经处理并关闭后调用可用的流。 当然,这会导致一个很好的IOException:流关闭。
我怎样才能随计时器一起停止计划任务? timer.cancel显然是不够的。
问候,乔伊
使用定时器任务的run()方法中的TimerTask.cancel()。 根据这种方法的Javadoc:
请注意,从重复计时器任务的run方法内调用此方法可绝对保证计时器任务不会再次运行。
private Timer reportTimer = null;
    if (reportTimer != null) {
        reportTimer.cancel();
        reportTimer = null;
    }
    reportTimer = new Timer();
    reportTimer.schedule(new TimerTask() {}
