线程以java.util.concurrent API结尾

时间:2011-09-30 12:11:51

标签: java multithreading scheduled-tasks runnable

我正在使用线程,并决定使用最现代的API(java.util.concurrent包)。

这就是我想要做的事情(伪代码):

//List of threads

private ScheduledExecutorService checkIns = Executors.newScheduledThreadPool(10);
//Runnable class

private class TestThread implements Runnable{
  private int index = 0;
  private long startTime = 0;
  private long timeToExecute = 3000000;
   public TestThread(int index){
      this.index = index;
   }

   public void run(){
      if(startTime == 0)
        startTime = System.currentTimeMillis();
      else if(startTime > (startTime+timeToExecute))
           //End Thread
      System.out.println("Execute thread with index->"+index);
    }
}

//Cycle to create 3 threads
for(int i=0;i< 3; i++)
    checkIns.scheduleWithFixedDelay(new TestThread(i+1),1, 3, TimeUnit.SECONDS);

我想在特定日期运行任务并重复一段时间。经过一段时间后,任务结束。我唯一的问题是如何以线程结束?

3 个答案:

答案 0 :(得分:1)

好吧,你可以在任务不再执行时抛出异常,但这是相当野蛮的替代方案:

  • 安排任务一次,使任务知道调度程序,因此它可以在完成当前迭代时重新安排自己 - 但只要它在最后一次之后立即返回。
  • 使用Quartz Scheduler之类的东西,它更适用于此类事物。

当然第一个版本可以封装成一个更令人愉快的形式 - 你可以创建一个“SchedulingRunnable”,它知道什么时候运行一个子任务(提供给它)和多长时间。

答案 1 :(得分:0)

run方法存在时,线程终止。好像你只需要做以下事情:

public void run(){
  if(startTime == 0)
    startTime = System.currentTimeMillis();

  while (System.currentTimeMillis() < (startTime+timeToExecute)){
       // do work here
  }

  //End Thread
  System.out.println("Execute thread with index->"+index);
}

答案 2 :(得分:0)

如果你想做一个连续的任务:在run函数中创建一个while循环,然后检查它是否运行得足够长。当任务完成(run()函数退出)时,Thread可以自由地用于其他任务。使用调度程序将任务重新设置为每天重复。

如果您不想要连续任务,您可以选择多个选项。我想说的很容易就是如果你想安排一个新的一次性任务来决定何时完成部分任务。