1. 程式人生 > 程式設計 >JavaScript定時器型別總結

JavaScript定時器型別總結

多執行緒 Java.Thread

1、執行緒簡介

程序和執行緒都是一個時間段的描述,是CPU工作時間段的描述。是執行中的程式指令的一種描述,這需要與程式中的程式碼區別開來。

電腦 = CPU + RAM +各種資源

電腦的執行 = CPU、暫存器、RAM的互動

  • CPU速度 >= 暫存器速度 >> RAM速度

  • 若多個任務需要執行時,則輪流使用CPU(在不同的策略下輪流的概念有偏差),但因為CPU速度很快,所以在外界看來時同時進行。

  • 在任何程式想要使用cpu之前,其他所需資源需要到位,處於就緒佇列中,用排程演算法呼叫執行

  • 程序的上下文環境 = 程序執行時環境 = 除CPU以外的所有執行環境,(主要是暫存器)

  • 先載入程序A的上下文,然後開始執行A,儲存程序A的上下文,調入下一個要執行的程序B的程序上下文,然後開始執行B,儲存程序B的上下文

程序和執行緒就是對應不同的CPU時間段的描述,執行緒共享同一程序的資源

程序是資源分配的最小單位

執行緒是CPU排程的最小單位


此處的執行緒指的是Java執行緒

2、執行緒的建立

名稱 屬性 簡介
Thread 繼承Thread類
Runnable 介面 實現Runnable介面
Callable 介面 瞭解Callable介面

優先順序:當某個執行緒中建立一個新的Thread物件時,新執行緒的優先順序=建立執行緒的優先順序

守護程序:守護程序能自動結束自己的生命週期,即便是有死迴圈也能輕鬆面對;

非守護程序:不能自動結束自己的生命週期,main程序就是一個典型的非守護程序

執行過程:主執行緒和子執行緒並行交替執行

注:執行緒不一定執行,看cpu排程安排

2.1、Thread建立執行緒

建立步驟:

  • 建立一個新的類,用來繼承Thread

  • 過載run方法

  • 用start方法啟用該執行緒

public class TestThread extends Thread{
    long prime;
    TestThread(long prime){
        this.prime = prime;
    }
    @Override
    public void run() {
        this.prime += 1;
        System.out.println("該數已經加一"+this.prime);
    }

    public static void main(String[] args) {
        TestThread thread = new TestThread(15);
        thread.start();
    }
}

例項:

  • 用commons-io包來多執行緒下載圖片

    public class TestThread2 extends Thread{
        String url;
        String fileName;
        TestThread2(String url, String fileName){
            this.fileName = fileName;
            this.url = url;
        }
    
        @Override
        public void run() {
            WebDownload webDownload = new WebDownload();
            webDownload.downloader(this.url,this.fileName);
            System.out.println("下載的檔名為"+this.fileName);
        }
    
        public static void main(String[] args) {
            TestThread2 thread = new TestThread2("https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF"
                                                    ,"1.jpg");
    
            TestThread2 thread2 = new TestThread2("https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF"
                    ,"2.jpg");
    
            TestThread2 thread3 = new TestThread2("https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF"
                    ,"3.jpg");
    
            thread.start();
            thread2.start();
            thread3.start();
            System.out.println("程式結束");
        }
    }
    
    class WebDownload{
        public void downloader(String url, String fileName){
            try {
                FileUtils.copyURLToFile(new URL(url),new File(fileName));
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("IO異常,downloader方法出現問題");
            }
        }
    }
    

2.2、Runnable介面建立程序

建立步驟

  • 建立一個新的類,用來實現Runnable介面

  • 過載run方法

  • 把新類物件作為建立Thread物件的實參

  • 用Thread物件的start方法啟用該執行緒

public class TestRunnable implements Runnable{
    long prime;
    TestRunnable(long prime){
        this.prime = prime;
    }
    @Override
    public void run(){
        this.prime += 1;
        System.out.println("prime改變了嗎"+this.prime);
    }

    public static void main(String[] args) {
        TestRunnable thread = new TestRunnable(10);
        new Thread(thread).start();
    }
}