Spring Boot定时任务超时管理与优雅中断Spring Boot的@Scheduled注解极大简化了定时任务的开发,但在面对长时间运行或可能“挂起”的任务时,默认行为可能导致问题。本文将深入探讨如何为Spring Boot定时任务设置超时机制,确保任务在规定时间内完成,并能在超时时被优雅中断,从而避免资源耗尽或任务堆积。

spring boot定时任务超时管理与优雅中断spring boot的@scheduled注解极大简化了定时任务的开发,但在面对长时间运行或可能“挂起”的任务时,默认行为可能导致问题。本文将深入探讨如何为spring boot定时任务设置超时机制,确保任务在规定时间内完成,并能在超时时被优雅中断,从而避免资源耗尽或任务堆积。

本文详细介绍了如何在Spring Boot中为@Scheduled定时任务实现超时控制。通过配置ThreadPoolTaskScheduler并结合Future的超时等待机制,可以确保长时间运行的任务在达到预设阈值时被中断,避免任务无限期阻塞或资源耗尽。文章提供了完整的代码示例和关键注意事项,帮助开发者构建更健壮的定时任务系统。

1. 问题背景:@Scheduled的默认行为与挑战

Spring Boot的@Scheduled注解是实现定时任务的常用方式。例如,使用fixedDelay可以确保当前任务执行完成后,再等待指定延迟时间启动下一次任务:

import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;@Componentpublic class TextFilter {        @Scheduled(fixedDelay = 5 * 60 * 1000) // 5分钟    public void updateSensitiveWords() {        System.out.println("开始执行敏感词更新任务...");        // 模拟一个耗时操作        try {            Thread.sleep(3 * 60 * 1000); // 假设正常耗时3分钟        } catch (InterruptedException e) {            Thread.currentThread().interrupt(); // 重新设置中断标志            System.out.println("敏感词更新任务被中断!");            return;        }        System.out.println("敏感词更新任务完成。");    }}

然而,如果updateSensitiveWords方法因外部服务响应慢、死锁或逻辑错误等原因导致执行时间过长(例如超过20分钟),那么下一次任务的启动将无限期延迟,甚至可能导致后续任务无法按时执行,进而影响系统稳定性。@Scheduled注解本身并没有提供直接的timeout属性来声明任务的执行超时时间。为了解决这个问题,我们需要借助Spring调度机制的底层组件——ThreadPoolTaskScheduler。

2. 理解ThreadPoolTaskScheduler

在Spring Boot中,当您使用@EnableScheduling启用定时任务时,默认会有一个TaskScheduler实例在后台运行,通常是ThreadPoolTaskScheduler。这个调度器管理着一个线程池,用于执行所有@Scheduled注解的任务。通过自定义配置ThreadPoolTaskScheduler,我们可以获得对任务执行的更精细控制,包括实现任务超时中断。

3. 实现定时任务超时中断

实现定时任务超时的核心思路是:在@Scheduled方法内部,将实际的业务逻辑提交到一个独立的执行器(可以是同一个ThreadPoolTaskScheduler,也可以是专门的ExecutorService),然后通过Future对象来监控其执行状态,并在达到超时时间时尝试取消它。

3.1 步骤一:配置自定义ThreadPoolTaskScheduler Bean

首先,我们需要创建一个配置类,自定义并暴露一个ThreadPoolTaskScheduler Bean。这将允许我们设置线程池的大小、线程名称前缀,以及最重要的——取消策略。

ViiTor实时翻译 ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116 查看详情 ViiTor实时翻译

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;@Configuration@EnableScheduling // 启用Spring的定时任务功能public class SchedulingConfig {    @Bean    public ThreadPoolTaskScheduler taskScheduler() {        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();        scheduler.setPoolSize(10); // 设置线程池大小,根据任务数量和并发需求调整        scheduler.setThreadNamePrefix("MyScheduledTask-"); // 设置线程名称前缀,方便日志追踪        scheduler.setWaitForTasksToCompleteOnShutdown(true); // 在应用关闭时等待所有任务完成        scheduler.setAwaitTerminationSeconds(60); // 最多等待60秒让任务完成        // 关键设置:当任务被取消时,尝试从工作队列中移除并中断其线程。        // 对于实现超时中断至关重要,因为Future.cancel(true)依赖此设置来中断线程。        scheduler.setRemoveOnCancelPolicy(true);         scheduler.initialize(); // 初始化调度器        return scheduler;    }}

setRemoveOnCancelPolicy(true)的重要性:这个设置是实现任务超时中断的关键。当一个Future被调用cancel(true)时,如果此策略为true,调度器会尝试中断正在执行该任务的线程。这意味着您的任务代码必须是“可中断的”,即能够响应InterruptedException。

3.2 步骤二:在@Scheduled任务中实现超时逻辑

接下来,修改您的@Scheduled任务,使其不再直接执行耗时操作,而是将耗时操作包装成一个Callable或Runnable,并提交给上面配置的taskScheduler(或另一个ExecutorService)。然后,使用Future.get(timeout, TimeUnit)来等待结果并处理超时。

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;import org.springframework.stereotype.Component;import java.util.concurrent.Callable;import java.util.concurrent.Future;import java.util.concurrent.TimeUnit;import java.util.concurrent.TimeoutException;@Componentpublic class TimedTextFilter {    @Autowired    private ThreadPoolTaskScheduler taskScheduler; // 注入我们自定义的调度器    private final long TASK_TIMEOUT_MINUTES = 2; // 任务超时时间:2分钟    @Scheduled(fixedDelay = 5 * 60 * 1000) // 每5分钟(在前一个任务结束后)触发一次    public void triggerUpdateSensitiveWordsWithTimeout() {        System.out.println("----------------------------------------");        System.out.println("定时任务触发:开始执行敏感词更新任务(带超时控制)...");        // 将实际的业务逻辑封装成一个 Callable        Callable actualTask = () -> {            System.out.println("子任务开始执行:实际敏感词更新逻辑...");            try {                // 模拟一个耗时操作,可能正常完成,也可能超时                long simulatedDuration = 3 * 60 * 1000; // 模拟耗时3分钟,超过2分钟的超时                // long simulatedDuration = 1 * 60 * 1000; // 模拟耗时1分钟,在超时内完成                for (int i = 0; i < simulatedDuration / 1000; i++) {                    Thread.sleep(1000); // 每秒检查一次中断                    if (Thread.currentThread().isInterrupted()) {                        System.out.println("子任务:检测到中断信号,提前退出!");                        return null; // 任务被中断,直接返回                    }                }                System.out.println("子任务完成:实际敏感词更新逻辑执行完毕。");            } catch (InterruptedException e) {                Thread.currentThread().interrupt(); // 重新设置中断标志                System.out.println("子任务:捕获到InterruptedException,任务被中断!");            } catch (Exception e) {                System.err.println("子任务执行异常: " + e.getMessage());            }            return null;        };        // 提交任务到调度器,并获取 Future        Future future = taskScheduler.submit(actualTask);        try {            // 等待任务完成,设置超时时间            future.get(TASK_TIMEOUT_MINUTES, TimeUnit.MINUTES);            System.out.println("主调度器:敏感词更新任务在规定时间内完成。");        } catch (TimeoutException e) {            // 任务超时了            System.err.println("主调度器:敏感词更新任务超时(超过 " + TASK_TIMEOUT_MINUTES + " 分钟)!");            // 尝试取消任务。true表示如果任务正在运行,尝试中断其线程。            boolean cancelled = future.cancel(true);             System.err.println("主调度器:任务取消尝试结果: " + (cancelled ? "成功" : "失败或已完成"));        } catch (InterruptedException e) {            Thread.currentThread().interrupt(); // 重新设置中断标志            System.err.println("主调度器:当前线程被中断,任务未完成。");            future.cancel(true); // 尝试取消子任务        } catch (Exception e) {            System.err.println("主调度器:任务执行过程中发生其他异常: " + e.getMessage());            future.cancel(true); // 发生异常也尝试取消子任务        } finally {            System.out.println("定时任务结束:敏感词更新任务(带超时控制)处理完毕。");            System.out.println("----------------------------------------");        }    }}

4. 关键注意事项

任务的可中断性:为了让future.cancel(true)真正生效,您的业务逻辑代码(即actualTask中的内容)必须是“可中断的”。这意味着在耗时操作中,您需要:

定期检查Thread.currentThread().isInterrupted()标志。在捕获InterruptedException时,通常需要重新设置中断标志Thread.currentThread().interrupt(),并根据业务逻辑决定是退出任务还是继续。许多阻塞方法(如Thread.sleep(), Object.wait(), BlockingQueue.put(), Socket.read()等)在接收到中断信号时会自动抛出InterruptedException。

异常处理:在future.get()的try-catch块中,务必处理TimeoutException(表示任务超时)、InterruptedException(表示当前线程被中断)和ExecutionException(表示任务执行过程中抛出了异常)。在这些情况下,通常都需要调用future.cancel(true)来确保子任务被妥善处理。

线程池大小:setPoolSize()需要根据您的定时任务数量和每个任务的执行时间来合理设置。如果池子太小,任务可能会排队等待,导致实际执行时间晚于预期。如果池子太大,可能会消耗过多系统资源。

fixedDelay与fixedRate:

fixedDelay:上一个任务执行完成后才开始计时,然后等待指定延迟时间再启动下一个任务。即使任务超时被中断,fixedDelay也能确保下一次任务在中断后按时启动(因为前一个任务的“完成”时间被记录为future.get()返回或抛出异常的时间)。fixedRate:无论上一个任务是否完成,都以固定的频率启动新任务。如果任务执行时间超过了fixedRate,那么多个任务实例可能会并发运行。在超时中断的场景下,fixedRate可能会导致任务实例堆积,除非您在任务开始时就进行并发控制(例如,使用AtomicBoolean来确保只有一个实例在运行)。对于需要严格控制并发的场景,通常推荐使用fixedDelay配合超时控制。

资源清理:如果您的任务涉及外部资源(如文件句柄、数据库连接、网络连接等),当任务被中断时,需要确保这些资源能够被正确关闭和释放,以避免资源泄露。在catch (InterruptedException e)块或finally块中进行清理是良好的实践。

5. 总结

通过配置ThreadPoolTaskScheduler并结合Future的超时等待机制,我们可以有效地为Spring Boot的@Scheduled定时任务添加超时控制。这种方法提供了强大的灵活性,允许我们精确地管理任务的生命周期,确保即使面对耗时或异常的任务,系统也能保持稳定和响应。记住,实现可中断的任务逻辑是确保超时机制有效工作的关键。

以上就是Spring Boot定时任务超时管理与优雅中断Spring Boot的@Scheduled注解极大简化了定时任务的开发,但在面对长时间运行或可能“挂起”的任务时,默认行为可能导致问题。本文将深入探讨如何为Spring Boot定时任务设置超时机制,确保任务在规定时间内完成,并能在超时时被优雅中断,从而避免资源耗尽或任务堆积。的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/250226.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何通过游戏实测判断CPU与显卡的匹配度?
上一篇 2025年11月4日 05:09:58
OPPO高管曝光Find X9外观设计 冷雕工艺+全系轻薄
下一篇 2025年11月4日 05:10:33

相关推荐

  • 怎么让豆包AI生成Python数据可视化代码

    怎么让豆包AI生成Python数据可视化代码怎么让豆包AI生成Python数据可视化代码怎么让豆包AI生成Python数据可视化代码怎么让豆包AI生成Python数据可视化代码

    明确需求、指定图表类型和库、提供数据结构或示例,能高效让豆包ai生成python可视化代码。1. 先说明要画什么图,如“柱状图”;2. 指定用哪个库,如matplotlib或seaborn;3. 提供数据结构或部分数据;4. 检查生成代码是否完整,必要时补充导入语句或显示命令。 ☞☞☞AI 智能聊天…

    2026年9月26日 • 用户投稿
    000
  • 京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制

    京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制

    “网购时绑定新银行卡会不会被盗刷?””信用卡在平台消费是否存在风险?”随着京东等电商平台支付场景的不断拓展,用户对支付安全的关注度持续攀升。本文深入剖析京东新卡支付与信用卡支付的安全机制,用技术逻辑和平台规则消除你的顾虑。 一、京东新卡支付安全机制解析 1. 什么是京东新卡支付? 当用户首次在京东使…

    2026年9月26日 • 用户投稿
    000
  • Tomcat日志中常见的性能瓶颈是什么

    在tomcat日志中,常见的性能瓶颈主要包括以下几个方面: 线程数配置不当: 问题描述:Tomcat的线程数配置不合理可能导致请求堆积或线程资源浪费。如果线程数过少,可能无法处理高并发请求,导致请求延迟增加。相反,线程数过多可能导致频繁的上下文切换和资源竞争,影响性能。解决方法:根据服务器的硬件资源…

    2026年9月26日
    000
  • 《少林vs武当:传奇》上架Steam 暂不支持中文

    《少林vs武当:传奇》上架Steam 暂不支持中文《少林vs武当:传奇》上架Steam 暂不支持中文《少林vs武当:传奇》上架Steam 暂不支持中文《少林vs武当:传奇》上架Steam 暂不支持中文

    近日,格斗游戏新作《少林vs武当:传奇》(shaolin vs wutang legends)正式登陆steam平台,目前尚未公布具体发售时间,且暂未提供中文支持。 Steam商店页面:[点击前往](https://www.php.cn/link/b1a5a84a3388b3f37634445bd1…

    2026年9月26日 • 用户投稿
    000
  • 雷神 911 主机如何测试 M.2 接口?带宽性能评估​

    雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​

    要测试雷神 911 主机 m.2 接口的带宽性能,首先确认其支持的协议(pcie 或 sata)及规格,可查阅主板说明书或使用硬件检测工具;准备 m.2 ssd、最新驱动、windows 10/11 系统及测试软件如 crystaldiskmark 和 as ssd benchmark;运行测试并记…

    2026年9月26日 • 用户投稿
    000
  • 如何在Java方法中正确传递和使用数组参数

    如何在Java方法中正确传递和使用数组参数如何在Java方法中正确传递和使用数组参数如何在Java方法中正确传递和使用数组参数如何在Java方法中正确传递和使用数组参数

    本文旨在帮助Java初学者理解如何在方法中正确传递和使用数组作为参数。通过一个实际的代码示例,详细讲解了如何创建、传递和访问数组,以及如何在方法内部对数组进行操作,最终返回期望的结果。掌握这些技巧对于编写高效且功能完善的Java程序至关重要。 在Java编程中,方法经常需要接收数组作为参数,以便对一…

    2026年9月26日 • 用户投稿
    500
  • 货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解

    货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解

    货拉拉司机版通过AI智能匹配系统,基于位置、车辆类型、货运需求与历史行为等数据筛选高匹配订单,并结合AR识货、智能导航与安全预警功能,提升接单效率与运输安全。 如果您在货拉拉司机版中希望获得更高效的接单体验,但不清楚如何利用系统内的AI功能来获取最适合的订单,则可能是由于尚未了解智能匹配机制的运作方…

    2026年9月26日 • 用户投稿
    200
  • 通过Intent将图片分享至Adobe Lightroom (Android)

    通过Intent将图片分享至Adobe Lightroom (Android)通过Intent将图片分享至Adobe Lightroom (Android)通过Intent将图片分享至Adobe Lightroom (Android)通过Intent将图片分享至Adobe Lightroom (Android)

    本文将介绍如何使用Kotlin代码,通过隐式Intent将Android应用中的图片直接分享至Adobe Lightroom移动版。通过设置Intent的Action、Extra和Type,并指定目标应用的包名,可以实现从自定义应用无缝跳转至Lightroom进行图片编辑的目的。本文将提供详细的代码…

    2026年9月26日 • 用户投稿
    100
  • vivo X300系列重构移动影像体验,全链路创新开启场景化创作新时代

    vivo X300系列重构移动影像体验,全链路创新开启场景化创作新时代vivo X300系列重构移动影像体验,全链路创新开启场景化创作新时代vivo X300系列重构移动影像体验,全链路创新开启场景化创作新时代vivo X300系列重构移动影像体验,全链路创新开启场景化创作新时代

    9月26日,vivo在“x系列蓝图影像技术沟通会”上正式发布全新影像战略,提出以“场景解决方案”为核心,构建开放协同的影像生态,推动移动影像从功能性工具向文化表达载体跃迁。作为这一战略的首款实践之作,vivo x300系列通过全链路技术创新,在画质表现、极限拍摄、旅行人像及视频创作四大维度实现全面突…

    2026年9月26日 • 用户投稿
    000
  • Debian系统上Tomcat日志如何备份

    Debian系统上Tomcat日志如何备份Debian系统上Tomcat日志如何备份Debian系统上Tomcat日志如何备份Debian系统上Tomcat日志如何备份

    本文介绍几种在Debian系统上备份Tomcat日志文件的有效方法,帮助您安全地保存和管理重要的日志信息。 方法一:手动备份 找到日志文件: Tomcat日志文件通常位于 /var/log/tomcat 或 /opt/tomcat/logs 目录下。请根据您的实际安装路径进行调整。压缩日志: 使用 …

    2026年9月26日 • 用户投稿
    000
  • Linux如何从源码编译安装软件_configure与make命令详解

    Linux如何从源码编译安装软件_configure与make命令详解Linux如何从源码编译安装软件_configure与make命令详解Linux如何从源码编译安装软件_configure与make命令详解Linux如何从源码编译安装软件_configure与make命令详解

    答案是掌握 ./configure 和 make 的作用与用法可完成 Linux 源码编译安装。1. configure 检查系统环境并生成 Makefile,确保编译条件满足,支持 –prefix、–enable、–with 等选项定制安装;2. make 读取…

    2026年9月26日 • 用户投稿
    000
  • Debian上Tomcat日志文件过大怎么办

    Debian上Tomcat日志文件过大怎么办Debian上Tomcat日志文件过大怎么办Debian上Tomcat日志文件过大怎么办Debian上Tomcat日志文件过大怎么办

    Debian系统中Tomcat日志文件(例如catalina.out)过大,可能导致磁盘空间占用过多,影响系统性能,并增加日志管理和分析的难度。本文提供几种解决方法: 方法一:利用logrotate实现日志轮转 logrotate是Linux系统自带的日志管理工具,可自动轮转、压缩和删除日志文件。 …

    2026年9月26日 • 用户投稿
    100
  • LINUX连接不上WiFi怎么办_LINUX系统WiFi连接失败排查指南

    LINUX连接不上WiFi怎么办_LINUX系统WiFi连接失败排查指南LINUX连接不上WiFi怎么办_LINUX系统WiFi连接失败排查指南LINUX连接不上WiFi怎么办_LINUX系统WiFi连接失败排查指南LINUX连接不上WiFi怎么办_LINUX系统WiFi连接失败排查指南

    首先检查无线网卡是否被系统识别,通过lspci或lsusb命令确认硬件存在;若识别正常但无法连接,需安装对应驱动如firmware-iwlwifi或rtl88x2bu-dkms;确保NetworkManager服务已启动并启用;使用nmcli命令扫描并连接WiFi网络;若仍失败,可手动编辑Netpl…

    2026年9月26日 • 用户投稿
    400
  • Java 方法中数组参数的正确调用方式

    Java 方法中数组参数的正确调用方式Java 方法中数组参数的正确调用方式Java 方法中数组参数的正确调用方式Java 方法中数组参数的正确调用方式

    本文旨在阐述如何在 Java 方法中正确传递和使用数组参数。通过一个实际的例子,我们将详细讲解如何创建数组、将其作为参数传递给方法,以及如何在方法内部访问和操作数组元素。掌握这些技巧对于编写高效且易于维护的 Java 代码至关重要。 在 Java 编程中,方法经常需要接收数组作为参数,以便对一组数据…

    2026年9月26日 • 用户投稿
    000
  • 从Scanner读取单个字符时处理空格的问题

    从Scanner读取单个字符时处理空格的问题从Scanner读取单个字符时处理空格的问题从Scanner读取单个字符时处理空格的问题从Scanner读取单个字符时处理空格的问题

    本文旨在解决Java中使用Scanner读取用户输入时,由于Scanner默认以空格作为分隔符,导致读取单个字符时出现的问题。我们将深入探讨Scanner的工作原理,并提供使用Scanner.nextLine()方法读取整行输入来解决此问题的方案,确保程序能够正确处理包含空格的输入。 在使用Java…

    2026年9月26日 • 用户投稿
    100
  • grokAI平台官方网站主页 grokAI 智能助手入口官方直达地址

    GrokAI平台官方网站主页是https://grok.com/,用户可直接访问该网址进入。新用户无需注册即可点击“Start Chatting”体验基础功能,登录X账号则可使用高级服务。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Gr…

    2026年9月26日
    100
  • 从 0 开始学 V8 漏洞利用之 V8 通用利用链(二)

    作者:hcamael@知道创宇404实验室 相关阅读:从 0 开始学 V8 漏洞利用之环境搭建(一)经过一段时间的研究,先进行一波总结,不过因为刚开始研究没多久,也许有一些局限性,以后如果发现了,再进行修正。 概述 ‍我认为,在搞漏洞利用前都得明确目标。比如打CTF做二进制的题目,大部分情况下,目标…

    2026年9月26日
    100
  • 强!荣耀 Magic V5 官宣搭载 6100mAh 青海湖刀片电池

    强!荣耀 Magic V5 官宣搭载 6100mAh 青海湖刀片电池强!荣耀 Magic V5 官宣搭载 6100mAh 青海湖刀片电池强!荣耀 Magic V5 官宣搭载 6100mAh 青海湖刀片电池强!荣耀 Magic V5 官宣搭载 6100mAh 青海湖刀片电池

    官方消息透露,7 月 2 日晚 19:00,荣耀将召开 magic v5 及 ai 终端生态发布会。届时,荣耀 magic v5 等多款旗舰新品将同步登场。早在 6 月 25 日,荣耀就已为 magic v5 开启预热宣传。据 cnmo 掌握的信息,这款折叠屏手机搭载了容量高达 6100mah 的青…

    2026年9月26日 • 用户投稿
    100
  • sublime怎么解决mac上无法使用命令行subl的问题_sublime Mac命令行Subl问题解决

    sublime怎么解决mac上无法使用命令行subl的问题_sublime Mac命令行Subl问题解决sublime怎么解决mac上无法使用命令行subl的问题_sublime Mac命令行Subl问题解决sublime怎么解决mac上无法使用命令行subl的问题_sublime Mac命令行Subl问题解决sublime怎么解决mac上无法使用命令行subl的问题_sublime Mac命令行Subl问题解决

    首先确认Sublime Text已安装在/Applications/Sublime Text.app,然后通过sudo ln -s /Applications/Sublime Text.app/Contents/SharedSupport/bin/subl /usr/local/bin/subl创建…

    2026年9月26日 • 用户投稿
    100
  • 伊津野英昭腾讯原创3A新情报:融合鬼泣、龙信精华!

    伊津野英昭腾讯原创3A新情报:融合鬼泣、龙信精华!伊津野英昭腾讯原创3A新情报:融合鬼泣、龙信精华!伊津野英昭腾讯原创3A新情报:融合鬼泣、龙信精华!伊津野英昭腾讯原创3A新情报:融合鬼泣、龙信精华!

    据automatonmedia报道,《鬼泣》系列总监、《龙之信条》系列主导者伊津野英昭近日在接受《fami通》采访时,分享了他离开卡普空后首个新项目的最新进展。 伊津野在卡普空工作长达30年,于2024年8月正式离职,并加入腾讯,出任光子工作室日本分部负责人。他目前正在主导开发的首款作品,是一款面向…

    2026年9月26日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信