1. 程式人生 > >java 多執行緒上傳解壓檔案

java 多執行緒上傳解壓檔案

舉個公司專案開發遇到的一個簡單例子,使用者上傳壓縮檔案到伺服器後,要對該壓縮包進行兩個操作,一是將該壓縮包複製到指定目錄,一是將該壓縮包解壓到另一指定目錄,最終響應使用者提示檔案上傳成功。如果壓縮包很大的話,上傳後進行的複製和解壓功能也會佔用很長時間,使用者就會等待很長的時間。其實複製和解壓的功能和使用者操作沒有直接關係,完全可以獨立出來,其解決的思路如下:
    當用戶上傳壓縮檔案完畢之後,我們立即建立兩個執行緒,一是複製壓縮檔案的執行緒;二是解壓壓縮檔案的執行緒。我們可以通過執行緒的構造方法把檔案的資訊傳遞給相應的執行緒,當我們啟動兩執行緒的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秒鐘