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

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

	}
}




你可能感兴趣的:(基础知识)