Java实现“睡排序”——线程池Executors的使用

前提

之前在知乎上看见一个有意思的排序算法——睡排序。

睡排序最早好像是4chan上一个用户用shell脚本实现的:

算法思想简洁明了:利用进程的sleep来实现 越大的数字越迟输出。

虽然像2L说的那样,这个算法没什么利用价值。但我打算试着用Java来实现一下这个“睡排序”。

Java实现

既然选择用Java来实现,我们就没必要为数组中每一个元素启一个进程,启多线程就够了。

Java启线程的方式有很多:1.继承Thread 2.实现Runnable 3.实现Callable ...

而当前需求是要同时启固定数量的多个线程,那么通过Executor提供的线程池来启线程最合适不过了。

下面是代码:

    public static List<Integer> sleepSort(int[] nums){
        List<Integer> res = new Vector<>();
        ExecutorService executor = Executors.newFixedThreadPool(nums.length);
        IntStream.of(nums).forEach(i -> executor.execute(() -> {
            try {
                Thread.sleep(i * 200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            res.add(i);
        }));
        executor.shutdown();
        while (true){
            if (executor.isTerminated())
                break;
        }
        return res;
    }

几个注意点:

1. 作为一个排序方法只是打印结果的话未免有些单调,所以我打算返回一个List作为排序后的结果。

猜你喜欢

转载自www.cnblogs.com/yucfeng/p/9204677.html