前段时间开发的项目中有一个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();
}
}