【问题标题】:Why do some of my timers not execute their tasks at all?为什么我的一些计时器根本不执行他们的任务?
【发布时间】:2011-09-13 05:45:47
【问题描述】:

我正在开发一个多定时器任务项目。

首先,我设计了一些扩展 TimerTask 的类并重写了 run() 方法。在run()方法中,会打印一行当前时间。

其次,一个 Timer 是这样初始化的。

......
DataTask task1 = new DataTask();
myTaskList.add(task1);
DataTask task2 = new DataTask();
myTaskList.add(task2);
DataTask task3 = new DataTask();
myTaskList.add(task3);
DataTask task4 = new DataTask();
myTaskList.add(task4);

for(TimerTask task : myTaskList)
{
    Timer timer = new Timer();
    timer.schedule(task,1,60*1000);
}

......

public class DataTask extends TimerTask
{
     @override
     public void run()
     {
           System.out.println("print sth");
     }

}

一个线程中的一个任务。对吗?

有时任务工作,但有时任务不会打印任何东西,没有任何异常,而线程仍然活着。

这可能是什么原因?

【问题讨论】:

  • 您可以通过编写 System.currentTimeMillis() 来获取时间。很多时候,定时器类的使用可以很简单地实现。

标签: java multithreading timer timertask


【解决方案1】:

一个线程中的一个任务。对吗?

不,在后台,Timer 使用单个线程来调度提交的任务,但在您的情况下,由于您使用多个计时器,是的,每个任务都将在单独的线程中执行。如果您需要通过使用多个线程来运行多个任务,请查看并发包中的 Executors。查看 ExecutorService 类的 Javadoc 以获取示例。

【讨论】:

  • 好吧,我知道 Timer 可以安排任务,一个任务在一个线程中。但我不知道是什么导致了问题。
  • 需要更多细节,你说的是什么问题?例外?特别是哪些例外?我刚刚尝试了代码,它似乎工作正常。
  • -1 错误...他正在为每个任务创建一个新的计时器,因此每个任务都将在自己的线程中执行。
  • @Suraj:嗯,我确实提到了 Timer 在底层使用了一个线程。因此,提交给同一个 Timer 的多个任务将使用同一个线程。那句话听起来有点误导,因此我更正了。
  • 感谢您的帮助。此代码可能有效,但有时在我调用一些 SQL 查询并在其中更新时可能会出现问题。也许1-2天,也许2周,我不知道。无法捕捉到让我感到困惑的异常。
猜你喜欢
  • 2011-07-20
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
相关资源
最近更新 更多