线程在实际项目中简单的应用

为解决用户反馈的表单提交缓慢问题,本文详细介绍了如何通过将后台文件转换任务异步化来显著提高响应速度。具体实现包括使用线程和线程池来并发处理文件转换,如将Word、Excel等格式转换为PDF,从而避免阻塞主线程,提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间开发的项目中有一个office在线预览的功能,我们知道需要实现这个功能一般是

后台把用户上传的txt啊excel啊word啊先转换成pdf格式,然后使用pdf.js进行前台预览(有的还

需要转换成swf文件),功能倒是实现了,只是客户反馈提交表单的时候速度比较慢,我试了一下

,确实比较慢,大概好几十秒,这个有点无法忍受,所以后台转pdf的那个过程就将其使用线程,

以异步方式去处理。原理就和如下类似

不使用线程:

package thread;
 
public class SleepTest {
    public static void main(String[] args) throws Exception {
        System.out.println("begin");
        Thread.sleep(5000);//模拟业务场景
        System.out.println("end");
    }
}

例子很简单,控制台输出begin并且在五秒后打印end

使用线程

package thread;
 
public class SleepTest {
    public static void main(String[] args) throws Exception {
        System.out.println("begin");
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);//模拟业务场景
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        System.out.println("end");
    }
}

效果,执行后控制台立刻显示begin和end
因为目前我们不需要中间处理的结果,因此可以让它在后台执行,不阻塞主线程。

另外,也可以使用线程池实现上面的功能,代码如下:

package thread;
 
import java.util.concurrent.Executors;
 
public class SleepTest {
    public static void main(String[] args) throws Exception {
        System.out.println("begin");
        Executors.newSingleThreadExecutor().submit(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);// 模拟业务场景
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        System.out.println("end");
    }
}

结合实际项目中转pdf的例子

代码如下:

package org.framework.core.extend.swftools;
 
import org.framework.core.util.FileUtils;
 
/**
 * 文件转换调用接口
 * 
 * @author mosesframe
 *
 */
public class SwfToolsUtil {
    public static void convert2SWF(final String inputFile) {
 
        new Thread("文件转化服务") {
            public void run() {
                String extend = FileUtils.getExtend(inputFile);
                PDFConverter pdfConverter = new OpenOfficePDFConverter();
                SWFConverter swfConverter = new SWFToolsSWFConverter();
                if (extend.equals("pdf")) {
                    // swfConverter.convert2SWF(inputFile,extend);
                    // 该项目这里注释掉,前台预览使用了pdf.js,因此不需要转换成swf文件了,避免浪费更多的时间
                }
                if (extend.equals("doc") || extend.equals("docx")
                        || extend.equals("xls") || extend.equals("pptx")
                        || extend.equals("xlsx") || extend.equals("ppt")
                        || extend.equals("txt") || extend.equals("odt")) {
                    DocConverter converter = new DocConverter(pdfConverter,
                            swfConverter);
                    converter.convert(inputFile, extend);
                }
            }
        }.start();
 
    }
}

--------------------- 
原文:https://blog.youkuaiyun.com/u014417573/article/details/78675204 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值