我试图获得这样的行为:
线程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多线程新手)
答案 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);