You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让迭代/递归排序算法运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:17:33