舉個公司項目開發遇到的一個簡單例子,用戶上傳壓縮文件到服務器後,要對該壓縮包進行兩個操作,一是將該壓縮包複製到指定目錄,一是將該壓縮包解壓到另一指定目錄,最終響應用戶提示文件上傳成功。如果壓縮包很大的話,上傳後進行的複製和解壓功能也會佔用很長時間,用戶就會等待很長的時間。其實複製和解壓的功能和用戶操作沒有直接關係,完全可以獨立出來,其解決的思路如下:
當用戶上傳壓縮文件完畢之後,我們立即創建兩個線程,一是複製壓縮文件的線程;二是解壓壓縮文件的線程。我們可以通過線程的構造方法把文件的信息傳遞給相應的線程,當我們啓動兩線程的start方法後,我們就不必再關心其複製和解壓的操作,而是直接響應用戶,這樣用戶明顯感覺操作變快,而複製和解壓的操作仍在後臺偷偷的進行着。
實現多線程的方法有兩個,一是繼承Thread,二是實現接口Runnable。二者的區別不多說,繼承只能單繼承,而接口可以實現多個,故本人更傾向使用後者。
下面把代碼模型貼出來,供大家參考參考:
[java]
package com.yjd.test;
import java.io.File;
public class FileOperate {
public static void main(String[] args) {
Long begin = System.currentTimeMillis();
// 上傳文件
UploadFile uploadFile = new UploadFile();
File file = uploadFile.uploadFileMethod();
// 給線程傳遞參數
CoppyFile coppyFile = new CoppyFile(file);
UnZipFile unZipFile = new UnZipFile(file);
// 創建線程
Thread coppyThread = new Thread(coppyFile);
Thread unZipThread = new Thread(unZipFile);
// 啓動線程
coppyThread.start();
unZipThread.start();
Long end = System.currentTimeMillis();
// 響應用戶請求
System.out.println("恭喜,文件上傳成功,耗時:" + (end - begin) + "毫秒");
}
}
class UploadFile {
// 文件上傳
public File uploadFileMethod() {
File file = new File("filePath");
System.out.println("文件上傳完畢");
return file;
}
}
class CoppyFile implements Runnable {
private File file;
public CoppyFile(File file) {
this.file = file;
}
@Override
public void run() {
coppyFileMethod(file);
}
// 文件複製
public void coppyFileMethod(File file) {
// 睡眠15秒鐘