swing后台任务

简介

开发swing程序时,某些操作可能会比较耗时,如:

  • 请求http接口获取数据后才能渲染
  • 实现打字机效果渲染耗时较大(chat gpt效果)

如果不进行特殊处理,这些耗时操作将会导致用户UI端阻塞(转圈圈,无响应)等,造成体验较差。
如果你直接将这些耗时任务放入一个新的线程中,又会有新的问题,由于swing并不是线程安全的,多个线程进行修改UI组件可能会导致不可预测的效果。

swing线程模型

由于swing并不是线程安全的,开发swing程序时,应当遵从以下线程模型:

  • 事件调度线程: 所有与用户界面相关的操作都必须在称为"事件调度线程"的单一线程中执行。
  • 其他线程

Swing线程模型的基本原则是:所有用户界面的更新都必须在事件调度线程中进行。当用户与界面进行交互时,例如点击按钮或输入文本,Swing会生成相应的事件,并将其放入事件队列中。事件调度线程会从队列中依次取出事件,并在合适的时候执行相应的操作,例如更新界面、触发事件监听器等。

解决方案

开发者在编写Swing应用程序时,需要遵循以下几点:

  1. 任何涉及用户界面更新的操作都应该在事件调度线程中执行。可以使用Swing提供的工具类如SwingUtilities.invokeLater()或EventQueue.invokeLater()来将任务放入事件队列中。
  2. 长时间运行的任务应该在单独的线程中执行,以避免阻塞事件调度线程。可以使用SwingWorker类来实现这一点,它提供了方便的方法来在后台线程中执行任务,并在完成后更新用户界面。

使用 SwingUtilities.invokeLater() 的主要目的是确保界面更新操作在事件调度线程中执行,以避免多线程并发访问导致的线程安全问题。当需要在非事件调度线程(例如主线程或其他后台线程)中进行界面更新时,可以使用该方法来将任务切换到事件调度线程中执行。

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        // 在事件调度线程中执行的任务
        // 更新界面、触发事件监听器等操作
    }
});

使用 SwingWorker 可以有效地处理耗时任务,并在任务执行过程中更新用户界面,提供更好的用户体验。

SwingWorker<Integer, String> worker = new SwingWorker<Integer, String>() {
    @Override
    protected Integer doInBackground() throws Exception {
        // 在后台线程中执行的耗时任务
        // 返回任务的结果
        return 42;
    }

    @Override
    protected void process(List<String> chunks) {
        // 在事件调度线程中更新中间结果
        // 可以用于更新进度条或显示其他中间状态
    }

    @Override
    protected void done() {
        try {
            // 在任务完成后执行的操作
            // 获取任务的结果并更新用户界面
            int result = get();
            // 更新界面等操作
        } catch (InterruptedException | ExecutionException ex) {
            // 处理异常情况
        }
    }
};

worker.execute(); // 启动 SwingWorker 执行任务
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Swing 后台系统的源代码通常结合了 Java 程序设计和数据库技术,用于实现公司或组织的业务逻辑和数据管理。对于开发这种系统,需要掌握 Java 编程语言,以及 Swing 用户界面工具包、Spring、MyBatis 等框架,以及 SQL 和数据库编程。以下是可能包含在 Java Swing 后台系统源代码中的一些主要功能和代码段: 1. 用户认证和授权功能 认证模块通常包括用户登录、注销、密码重置功能等。用户授权可以实现权限控制和角色分配,也可以设置一些安全性检查和限制,如防止 SQL 注入等。 示例代码: public class AuthenticationService { public boolean authenticate(String username, String password) { // implementation } public void authorize(User user) { // implementation } } 2. 数据库管理和持久化 数据管理模块可以通过各种 ORM 框架,如 MyBatis、Hibernate 等,将数据存储在数据库中。一些 CRUD(创建、读取、更新、删除)操作可以在此处实现。 示例代码: public interface UserDao { User findById(long id); List<User> findAll(); void save(User user); void delete(User user); } 3. 日志记录和错误处理 日志记录模块用于记录应用程序运行日志和错误,方便排除故障和优化性能。 示例代码: public class LogService { public void info(String message) { // implementation } public void warn(String message) { // implementation } public void error(String message, Throwable throwable) { // implementation } } 4. 邮件和通知功能 Java Mail API 可以用于开发邮件应用程序,Spring 或 Java Message Service(JMS)可以用于开发通知服务。 示例代码: public class EmailService { public void sendEmail(String recipient, String subject, String message) { // implementation } } 以上仅是 Java Swing 后台系统源代码可能包含的主要功能和代码段的示例。其他功能包括文件上传、定时任务、缓存、搜索引擎等都可以通过相应的框架或库来实现。开发 Java Swing 后台系统需要良好的代码设计和结构,依赖注入、面向对象编程等概念的使用也非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值