如何让迭代/递归排序算法运行10分钟后终止并返回对应时长值?
实现排序任务10分钟超时自动终止的方案
嘿,这个需求其实可以通过Java的并发工具来实现,核心思路是把排序任务放到单独线程里监控执行时间,超时就终止任务并返回预设的10分钟值。下面给你详细的方案和代码修改示例:
核心思路
- 把排序任务封装成可异步执行的
Callable任务,这样可以获取执行结果(耗时) - 使用
ExecutorService提交任务,并通过get(timeout, unit)方法设置10分钟的超时等待 - 超时触发
TimeoutException时,直接返回10分钟对应的毫秒数(600000),同时中断排序任务线程避免资源浪费 - 自定义的排序算法中添加线程中断检查,让任务能更快响应终止信号
代码修改示例
首先,你需要导入Java并发相关的包:
import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.ExecutionException;
然后修改你的排序执行逻辑,以Quick Sort为例:
1. 封装排序任务为Callable
// 定义一个Callable来包装排序任务,返回耗时(毫秒) Callable<Long> quickSortTask = () -> { long startTime = System.currentTimeMillis(); // 调用你的快速排序方法,替换成你实际的排序调用 QuickSort.quickSort(yourArray); long endTime = System.currentTimeMillis(); return endTime - startTime; };
2. 提交任务并设置超时
ExecutorService executor = Executors.newSingleThreadExecutor(); long recordedDuration; String sortAlgorithm = "Quick Sort"; try { // 等待任务完成,最多等待10分钟 recordedDuration = executor.submit(quickSortTask).get(10, TimeUnit.MINUTES); System.out.println(sortAlgorithm + " 完成,耗时:" + recordedDuration + " 毫秒"); } catch (TimeoutException e) { // 超时触发,设置记录时长为10分钟(600000毫秒) recordedDuration = TimeUnit.MINUTES.toMillis(10); System.out.println(sortAlgorithm + " 执行超时(已达10分钟),自动终止,记录时长:" + recordedDuration + " 毫秒"); // 中断任务线程,强制终止排序 executor.shutdownNow(); } catch (InterruptedException | ExecutionException e) { // 处理其他异常(比如线程被中断、排序内部出错) e.printStackTrace(); recordedDuration = -1; // 用特殊值标记异常情况 executor.shutdown(); }
3. 让排序算法响应中断
为了让排序任务在超时后能尽快终止,建议在你自定义的排序方法中添加线程中断检查。比如修改Bubble Sort:
public static void bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { // 每次循环开始前检查线程是否被中断,是则立即退出 if (Thread.currentThread().isInterrupted()) { return; } for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换元素 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
其他排序算法(比如Quick Sort、Merge Sort)也可以在递归或循环的关键节点添加Thread.currentThread().isInterrupted()检查,确保能及时响应中断。
后续CSV存储的适配
当你获取到recordedDuration(无论是实际耗时还是10分钟的超时值),就可以把数据写入CSV文件了。这里给你一个简单的写入示例:
import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; // 写入CSV的方法 private static void writeToCsv(String algorithm, long duration) { String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); // CSV行格式:算法名称,时长(毫秒),记录时间戳 String csvLine = String.format("%s,%d,%s%n", algorithm, duration, timestamp); // 追加写入CSV文件(第二个参数true表示追加) try (FileWriter writer = new FileWriter("sort_performance.csv", true)) { writer.write(csvLine); } catch (IOException e) { System.err.println("写入CSV失败:" + e.getMessage()); } }
你只需要在得到recordedDuration后调用这个方法即可:
writeToCsv(sortAlgorithm, recordedDuration);
注意事项
- 如果你使用的是Java自带的排序方法(比如
Arrays.sort()),这些方法本身不会响应线程中断,超时后可能需要等待方法自然结束,但shutdownNow()会尝试中断线程,大部分情况下能加速终止。 - 记得在任务完成或异常后调用
executor.shutdown()或executor.shutdownNow()释放线程资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Jazz4Dayz
相关产品推荐
相关产品推荐

