天天看點

Java多線程實作(一)——繼承Thread類前言實作步驟執行個體——多線程下載下傳圖檔總結

文章目錄

  • 前言
  • 實作步驟
  • 執行個體——多線程下載下傳圖檔
  • 總結

前言

  • 什麼是多線程?

    我的了解為:将100輛汽車行駛的公路從單車道改成三車道,使得多條車道同時有車行駛,解決擁堵和時長問題。

    于是跟着狂神的視訊對該部分内容進行學習。

實作步驟

本篇博文通過繼承Thread類實作多線程任務。其實作步驟為:

1) 自定義的線程類繼承Thread類

2) 重寫run()方法,編寫線程執行體

3) 建立線程對象,調用start()方法啟動線程。

執行個體——多線程下載下傳圖檔

  • 目标:實作多線程下載下傳網頁上的圖檔到本地
  • 導入的包:common-io.jar包

    使用包中FileUtils類中方法copyURLToFile(),改方法通過檔案url位址将該檔案儲存到本地。

    我用的maven導入該包,代碼為:

<dependency>
	<groupId>commons-io</groupId>
	<artifactId>commons-io</artifactId>
	<version>2.6</version>
</dependency>
           
  • 實作該功能的步驟:

    1) 建立一個下載下傳器WebLoader類,類中寫入下載下傳圖像到本地的方法downloader()。

    2) 自定義一個線程類TestThread,繼承Thread類。

    3) 定義TestThread類的構造函數,傳入下載下傳需要的url參數和儲存圖像時需要的檔案名name。

    4) 重寫方法run()。run()方法為執行下載下傳圖像的執行體。建立WebLoader類對象,調用downloader()方法。

    5) 在main函數中建立線程類TestThread的對象,調用start()方法啟動線程。

import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;

public class TestThread extends Thread{
    private String url;
    private String name;

    public TestThread(String url, String name){
        this.url = url;
        this.name = name;
    }

    // 下載下傳圖檔的執行體
    @Override
    public void run() {
        WebLoader webLoader = new WebLoader();
        webLoader.downloader(url, name);
        System.out.println("下載下傳的檔案名為:" + name);
    }

    public static void main(String[] args) {
        TestThread testThread1 = new TestThread("https://bkimg.cdn.bcebos.com/pic/a8014c086e061d95fa492c5e79f40ad162d9ca4d?x-bce-process=image/resize,m_lfit,w_220,limit_1", "./pic1.png");
        TestThread testThread2 = new TestThread("https://bkimg.cdn.bcebos.com/pic/09fa513d269759ee8ca42c7ebbfb43166c22df8b?x-bce-process=image/resize,m_lfit,w_640,limit_1", "./pic2.png");
        TestThread testThread3 = new TestThread("https://bkimg.cdn.bcebos.com/pic/1c950a7b02087bf4310ebecdfed3572c11dfcf30?x-bce-process=image/resize,m_lfit,w_220,limit_1", "./pic3.png");

        testThread1.start();
        testThread2.start();
        testThread3.start();
    }
}

// 下載下傳器
class WebLoader{
    public void downloader(String url, String name){
        try {
            // url為下載下傳圖像的url位址, name為下載下傳圖像儲存到本地的名稱
            FileUtils.copyURLToFile(new URL(url), new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO異常,downloader有問題");
        }
    }
}
           
  • 結果

    第一次執行結果:

    Java多線程實作(一)——繼承Thread類前言實作步驟執行個體——多線程下載下傳圖檔總結
    第二次執行結果:
    Java多線程實作(一)——繼承Thread類前言實作步驟執行個體——多線程下載下傳圖檔總結
    由執行結果可以得出:線程不一定立即執行,而是并行交替進行,由cpu安排排程。

總結

繼承Thread類是實作多線程的一種方法,下一篇博文将介紹通過實作Runnable方法實作多線程。兩種方法相較更推薦第二種方法。因為該方法可避免單繼承的局限性,更加靈活友善,可使得同一個對象被多個線程使用。