小故事:
在一个神奇的小村庄里,村长有一群活泼可爱的小动物们,它们分别是兔子、松鼠、乌龟和蜗牛。每天晚上,村长都会安排一场特殊的比赛,让大家各自按照自己的速度去完成一项任务。
有一天,村长决定让他们按照年龄从小到大顺序排队,以便更好地照顾年幼的动物。但他又不想直接询问他们的年龄,于是他想出了一个有趣的办法。
他告诉每只动物:“今晚,你们每个人都按照自己年龄对应的小时数去睡觉。比如,如果你一岁,就睡一个小时再回来找我;两岁就睡两个小时,以此类推。”
夜幕降临,小动物们都纷纷回窝开始睡觉。首先,只有一岁的蜗牛很快就入睡并醒来,来到村长面前报到;接着,两岁的乌龟也按时醒来;然后是三岁的松鼠,最后是四岁的兔子。
就这样,随着夜晚的推进,小动物们按照年龄从小到大的顺序陆续回到了村长身边。村长看着眼前排列整齐的小动物队伍,满意地点了点头,感叹道:“原来这就是传说中的‘睡觉排序’啊!”
排序的使用一个思路,把每一个元素都进行睡眠,先醒的就是最小的,剩下的依次苏醒,最终达到排序效果。
在不考虑效率的情况下,也是满足了排序。只是作为一个思路,实际千万别用!
代码示例
public static void main(String[] args) throws ExecutionException, InterruptedException {
int[] arrToSort = {3, 2, 5, 1, 4};
ExecutorService executor = Executors.newFixedThreadPool(arrToSort.length);
List<Future<Void>> futures = new ArrayList<>();
for (int num : arrToSort) {
futures.add(executor.submit(new SleepSortTask(num)));
}
// 关闭线程池,等待所有任务完成
executor.shutdown();
while (!executor.isTerminated()) {}
// 输出结果
for (Future<Void> future : futures) {
// Future.get() 会阻塞直到任务完成
future.get();
}
}
static class SleepSortTask implements Callable<Void> {
private final int number;
public SleepSortTask(int number) {
this.number = number;
}
@Override
public Void call() {
try {
Thread.sleep(number * 1000L); // 假设睡眠时间单位为秒
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println(number);
return null;
}
}