多線程實例詳解 – JAVA編程語言程序開發技術文章

  多線程的概念在此就不多說瞭,打個通熟易懂比方,把自己看做一個進程,做的每件事都看做為線程,自己可以同時玩魔獸和聽歌,那麼玩魔獸和聽歌就是兩個線程,為多線程。
    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) + "毫秒"); 
    } 

 
/**
 * 上傳文件類
 * 
 * @author yangjd
 * 
 */ 
class UploadFile { 
    // 文件上傳 
    public File uploadFileMethod() { 
        File file = new File("filePath"); 
        System.out.println("文件上傳完畢"); 
        return file; 
    } 

 
/**
 * 復制文件類
 * 
 * @author yangjd
 * 
 */ 
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秒鐘 
        try { 
            Thread.sleep(15000); 
        } catch (InterruptedException e) { 
            e.printStackTrace(); 
        } 
        System.out.println("文件復制完畢"); 
    } 

 
/**
 * 解壓文件類
 * 
 * @author yangjd
 * 
 */ 
class UnZipFile implements Runnable { 
    private File file; 
 
    public UnZipFile(File file) { 
        this.file = file; 
    } 
 
    @Override 
    public void run() { 
        unZipFileMethod(file); 
 
    } 
 
    // 文件解壓 
    public void unZipFileMethod(File file) { 
        // 睡眠10秒鐘 
        try { 
            Thread.sleep(10000); 
        } catch (InterruptedException e) { 
            e.printStackTrace(); 
        } 
        System.out.println("文件解壓完畢"); 
    } 

作者:tjcyjd

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *