3 回答

TA贡献2065条经验 获得超14个赞
我认为使用 a 并以固定速率安排 a 将获得最佳java.util.Timer结果。TimerTask
假设您有一个TimerTask在执行时打印出日期的。
public class PrintTimeAndIdTask extends TimerTask {
private int id;
public PrintTimeAndIdTask(int id) {
this.id = id;
}
public void run() {
System.out.println(new Date() + " : " + id);
}
}
然后创建一个计时器并安排任务。每个都有不同的延迟,以便它们在您的首选时间间隔内平均分布。
public static void main(String[] args) {
Timer timer = new Timer();
int taskCount = 10;
int timeIntervalMs = 60000;
int delayBetweenTasks = timeIntervalMs / taskCount;
for (int i = 0; i < taskCount; i++) {
TimerTask timerTask = new PrintTimeAndIdTask(taskCount);
int taskDelay = (long) taskCount * delayBetweenTasks;
timer.scheduleAtFixedRate(timerTask, taskDelay, timeIntervalMs);
}
}
您会看到每 6 秒执行一次任务。
Wed Feb 20 17:17:37 CET 2019 : 0
Wed Feb 20 17:17:43 CET 2019 : 1
Wed Feb 20 17:17:49 CET 2019 : 2
Wed Feb 20 17:17:55 CET 2019 : 3
Wed Feb 20 17:18:01 CET 2019 : 4
Wed Feb 20 17:18:07 CET 2019 : 5
Wed Feb 20 17:18:13 CET 2019 : 6
Wed Feb 20 17:18:19 CET 2019 : 7
Wed Feb 20 17:18:25 CET 2019 : 8
Wed Feb 20 17:18:31 CET 2019 : 9
Wed Feb 20 17:18:37 CET 2019 : 0
Wed Feb 20 17:18:43 CET 2019 : 1
Wed Feb 20 17:18:49 CET 2019 : 2
Wed Feb 20 17:18:55 CET 2019 : 3
....
请记住,Timer默认情况下 a 不作为守护线程运行。如果您没有在应用程序关闭时明确取消它,它会继续运行,因此您的应用程序将不会关闭。

TA贡献1887条经验 获得超5个赞
你的意思是这样吗?产生一个线程的单个执行程序,该线程本身产生 10 个线程。
private static final int numProcesses = 10;
private static final ExecutorService executorService = Executors.newFixedThreadPool(numProcesses);
public static void main(String[] args)
{
final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(Test::spawnTenThreads, 0, 5, TimeUnit.SECONDS);
}
private static void spawnTenThreads()
{
for (int i = 0; i < numProcesses; ++i)
{
final int iteration = i;
executorService.submit(() -> System.out.println(iteration));
}
}
添加回答
举报