如何让线程在固定时间段内连续执行不同的任务?
How do I have a thread do different tasks consecutively for fixed time periods?
我正试图获得这样的行为:
Thread 1: |--- 3 mins of doing task A ---|--- 3 mins of doing task B ---|--- 3 mins of task C ---|
Thread 2: |--- 3 mins of doing task A ---|--- 3 mins of doing task B ---|--- 3 mins of task C ---|
...
Thread k: |--- 3 mins of doing task A ---|--- 3 mins of doing task B ---|--- 3 mins of task C ---|
并累加每个线程的任务B段的结果。
我不需要线程以同步方式执行任务(即任务 B 阶段的开始时间对齐),但确实需要每个单独线程的任务执行之间的间隙可以忽略不计。
我没有多少代码,因为我不确定如何构建它。到目前为止,我认为我必须创建 Callable
类 因为我想 return 在任务 B 的末尾创建一个值,但我不确定是否应该创建 3 个不同的可调用对象对于每个任务,或者是否可以将我的 3 个任务的所有代码都放在 1.
我能想到的唯一方法是在每个线程中执行以下操作(在 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 多线程的新手)
这好像和多线程没有关系。你描述的一切都是连续发生的。
可能是这样的:
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);
我正试图获得这样的行为:
Thread 1: |--- 3 mins of doing task A ---|--- 3 mins of doing task B ---|--- 3 mins of task C ---|
Thread 2: |--- 3 mins of doing task A ---|--- 3 mins of doing task B ---|--- 3 mins of task C ---| ...
Thread k: |--- 3 mins of doing task A ---|--- 3 mins of doing task B ---|--- 3 mins of task C ---|
并累加每个线程的任务B段的结果。
我不需要线程以同步方式执行任务(即任务 B 阶段的开始时间对齐),但确实需要每个单独线程的任务执行之间的间隙可以忽略不计。
我没有多少代码,因为我不确定如何构建它。到目前为止,我认为我必须创建 Callable
类 因为我想 return 在任务 B 的末尾创建一个值,但我不确定是否应该创建 3 个不同的可调用对象对于每个任务,或者是否可以将我的 3 个任务的所有代码都放在 1.
我能想到的唯一方法是在每个线程中执行以下操作(在 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 多线程的新手)
这好像和多线程没有关系。你描述的一切都是连续发生的。 可能是这样的:
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);