在Scheduler(Timer)的run方法内创建一个Scheduler(Timer)

时间:2013-06-28 10:38:12

标签: java timer scheduledexecutorservice

参考Java Timer ClassScheduledExecutorService interface,我可以在执行程序线程(其他调度程序)的run方法(或TimerTask)中设置调度程序(或计时器)吗?

案例研究: 我有一个包含歌曲列表(10,000)的数据库和播放歌曲的时间表。

所以我考虑创建一个调度程序(比如1)(1个小时),它将搜索数据库并为计划在一小时内播放的所有歌曲创建调度程序。

一小时后,scheduler1将删除所有线程并再次搜索数据库并为其他线程创建调度程序。

这是一个好主意吗?可以创建?

或者我应该一次创建10000个调度程序吗?

在这种情况下哪一个会更好的计时器或调度程序?

1 个答案:

答案 0 :(得分:1)

为什么不拨打ScheduledExecutorService.scheduleAtFixedRateScheduledExecutorService.scheduleWithFixedDelay

<强>更新

这是实现你想要的东西的一种方式:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

void start(final Connection conn)
{
  executor.scheduleWithFixedDelay(new Runnable(){ public void run(){ try { poll(conn); } catch (Exception e) { e.printStackTrace(); } } }, 0, 1, TimeUnit.HOURS);
}

private void poll(Connection conn) throws SQLException
{
  final ResultSet results = conn.createStatement().executeQuery("SELECT song, playtime FROM schedule WHERE playtime > GETDATE() AND playtime < GETDATE() + 1 HOUR");
  while (results.next())
  {
    final String song = results.getString("song");
    final Time time = results.getTime("playtime");

    executor.schedule(new Runnable(){ public void run() { play(song); } }, time.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
  }
}