多執行緒之初識執行緒

HuDu發表於2020-06-30

建立執行緒

要了解多執行緒,肯定要先知道如何建立執行緒,建立執行緒的方式有三種,繼承 Thread 類、實現 Runnable 介面、實現 Callable 介面。

//建立執行緒方式一:繼承Thread類,重寫run()方法,呼叫start開啟執行緒
public class TestThread1 extends Thread {
    @Override
    public void run() {
        //run方法執行緒體
        for (int i = 0; i < 20; i++) {
            System.out.println("我在學習 "+i);
        }
    }

    public static void main(String[] args) {
        //main執行緒,主執行緒

        //建立一個執行緒物件
        TestThread1 testThread1 = new TestThread1();
        //呼叫start()方法開啟方法
        testThread1.start();

        for (int i = 0; i < 20; i++) {
            System.out.println("我在學習多執行緒 "+i);
        }
    }
}
//建立執行緒方式2:實現runnable介面,重寫run方法,執行執行緒需要丟入runnable介面實現類,呼叫start方法
public class TestThread3 implements Runnable{
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("我在看程式碼");
        }
    }

    public static void main(String[] args) {

        //建立runnable介面的實現類物件
        TestThread3 testThread3 = new TestThread3();
        //建立執行緒物件,通過執行緒物件來開啟我們的執行緒,代理
        Thread thread = new Thread(testThread3);

        thread.start();

        for (int i = 0; i < 20; i++) {
            System.out.println("我在學習多執行緒");
        }
    }
}

第三種通過一個下載的jar包來演示,先匯入依賴

<dependencies>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.7</version>
        </dependency>
</dependencies>
//執行緒建立方式三;實現Callable介面
//先匯入一個依賴
/*
callable的好處
可以定義返回值
可以丟擲異常
 */
public class TestCallable implements Callable<Boolean> {

    private String url;
    private String name;

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

    public Boolean call() throws Exception {
        webDownloader webDownloader = new webDownloader();
        webDownloader.downloader(url,name);
        System.out.println("下載了檔案為"+name);
        return true;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        TestCallable t1 = new TestCallable("圖片地址", "1.jpg");
        TestCallable t2 = new TestCallable("圖片地址", "2.jpg");
        TestCallable t3 = new TestCallable("圖片地址", "3.jpg");

        //建立執行服務:
        ExecutorService ser = Executors.newFixedThreadPool(3);
        //提交執行服務
        Future<Boolean> r1 = ser.submit(t1);
        Future<Boolean> r2 = ser.submit(t2);
        Future<Boolean> r3 = ser.submit(t3);

        //獲取結果
        Boolean rs1 = r1.get();
        Boolean rs2 = r2.get();
        Boolean rs3 = r3.get();

        //關閉服務
        ser.shutdownNow();
    }
}


//下載器
class webDownloader{

    public void downloader(String url,String name) {
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("I0異常, downloader方法出現問題");
        }
    }

}

執行緒不安全

死鎖條件

  • 互斥條件: 一個資源每次只能被一個程式使用。
  • 請求與保持條件: 一個程式因請求資源而阻塞時,對已獲得的資源保持不放。
  • 不剝奪條件 :程式已獲得的資源,在末使用完之前,不能強行剝奪。
  • 迴圈等待條件 :若干程式之間形成一種頭尾相接的迴圈等待資源關係。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章