【问题标题】:Is there a way to know if a timerTask has completed?有没有办法知道 timerTask 是否已经完成?
【发布时间】:2013-08-25 17:42:28
【问题描述】:

我的问题是:我有两个代码块。一个代码块只有在 Timer 达到 10 秒时才执行。所以我用这段代码调用 TimerTask。另一个代码块只有在我不执行的情况下才执行'不要进入 TimerTask 函数..(run() 函数).. 有没有办法知道 TimerTask 是否已完成执行,例如返回一个布尔变量?我正在用 Java 编程。

我试过了:

TimerTask emd = new EsperaMensagemDigitada(outgoing, incoming);
timer.schedule(emd, 10000);
if(emd.cancel() == true){
   messageOut = userInput.readLine();               
   outgoing.println(messageOut + "            [Sua vez]");
   System.out.println("Aguardando resposta...");
   outgoing.flush();    
}

但它似乎总是会执行 if 子句中的代码..所以我还没有解决我的问题..

这个问题的另一部分是我有这个代码:

messageOut = userInput.readLine();

我想,如果用户在 10 秒内没有输入任何消息,我会打印一条默认消息,如果他在 10 秒内输入了一条消息,我会打印他的消息。问题是我卡在 userInput.readLine() 上,等待输入..

【问题讨论】:

  • 一种方式:给运行在任务属性改变的代码提供支持,这样当它改变状态时你可以通知监听器。

标签: java timer timertask


【解决方案1】:

您可以尝试使用 TimerTask.cancel() 取消 TimerTask,它返回的 boolean 值为 true,当且仅当取消导致计划任务未运行且 false strong> 否则(意味着任务已经被触发并且可能正在进行中或已经使用run() 方法完成)

【讨论】:

  • 这看起来比我在评论中的建议要好。 1+
  • 奇怪,但是当我尝试执行代码时: if(timer.cancel() == true){ ... } 我得到了错误:错误:'void' type not allowed here
  • @ChristianeOkamoto 你不取消Timer 你取消TimerTask
【解决方案2】:

我认为您应该为此目的使用FutureTaskScheduledExecutorServiceFutureTask 有一个 isDone 方法来检查它是否完成。由于TimerTask 实现了Runnable,你可以很容易地将你的任务包装在FutureTask 中:

FutureTask<?> futureTask = new FutureTask<Void>(timerTask, null);
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(futureTask, 10, TimeUnit.SECONDS);
if (futureTask.isDone()) {
    // ...
}

【讨论】:

  • 我还是不明白.. :( 我的问题是我有这个代码:messageOut = userInput.readLine(); 如果用户没有输入任何 10 的消息,我想要秒我打印一条默认消息,如果他输入一条消息直到 10 秒,我打印他的消息。问题是我卡在 userInput.readLine(),等待输入..
  • @ChristianeOkamoto 我误解了这个问题:然后检查this问题
猜你喜欢
  • 2015-02-13
  • 1970-01-01
  • 2020-02-06
  • 2014-09-11
  • 2011-06-07
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多