如何让线程在固定时间段内连续执行不同的任务?

时间:2016-01-23 01:43:10

标签: java multithreading benchmarking

我试图获得这样的行为:

  

线程1:| --- 3分钟做任务A --- | --- 3分钟做任务B --- | --- 3分钟任务C --- |

     

线程2:| --- 3分钟做任务A --- | --- 3分钟做任务B --- | --- 3分钟任务C --- |   ...

     

线程k:| --- 3分钟做任务A --- | --- 3分钟做任务B --- | --- 3分钟任务C --- |

并累积每个线程的任务B段的结果。

我不需要线程以同步的方式执行任务(即任务B阶段的开始时间对齐),但每个线程的任务执行之间确实需要可忽略的差距。

我没有太多的代码,因为我不知道如何构建它。到目前为止,我认为我必须创建Callable类,因为我想在任务B结束时返回一个值,但是我不确定是否应该为每个任务创建3个不同的callables,或者它是否& #39;可以将我的所有代码用于1中的3个任务。

我能想到的唯一方法是在每个线程中执行以下操作(在Callable中),但似乎每个while循环标头检查需要额外的时间,以及开始和结束时间计算,我真的需要在专用于任务的时间段内,以及在合理范围内它们的相邻性。

long start = System.currentTimeMillis();
long end = start + 180*1000;
while (System.currentTimeMillis() < end)
{
    // task A
}
start = System.currentTimeMillis();
end = start + 180*1000;
while (System.currentTimeMillis() < end)
{
    // task B
}
start = System.currentTimeMillis();
end = start + 180*1000;
while (System.currentTimeMillis() < end)
{
    // task C
}
return task_b_results;

有更好的方法吗? (Java多线程新手)

1 个答案:

答案 0 :(得分:1)

这似乎与多线程没有任何关系。你描述的一切都是连续发生的。 也许是这样的事情:

List<Task> tasks = Arrays.asList(
  new TaskA(), 
  new TaskB(), 
  new TaskC()
);
List<TaskResult> results = new List();

for(Task task: tasks) {
   long until = System.currentTimeMillis() + 180000L;
   TaskResult result = task.createResult();
   while(System.currentTimeMillis() < until) {
      result.add(task.call());
   }
   results.add(result);
}

return results.get(1);