多線程(一)

如果一個程序能夠運行多個線程,那么這個程序式多線程的.每個任務在一個線程中執(zhí)行,執(zhí)行線程簡稱線程.

線程與進程的區(qū)別

  • 進程是指在系統(tǒng)中正在運行的一個應用程序,它描述程序?qū)W(wǎng)絡,磁盤,內(nèi)存,CPU等一系列的占用.
  • 線程是進程內(nèi)獨立的單元,一個進程內(nèi)有若干個線程,但至少有一個線程,一般稱為主線程

實現(xiàn)線程的兩種方式

  • 建立Thread類的子類來定義線程,構(gòu)造Tread類的子類的對象,調(diào)用start()方法.這種方法不建議使用,應當把運行任務與運行機制解耦.如果有多個任務,每個任務都需要創(chuàng)建一個單獨線程,開銷會太大.
  • 實現(xiàn)Runnable接口,實現(xiàn)Runnable接口的類并不是一個線程類,重寫run方法中定義了運行任務,通過Thread的類創(chuàng)建線程對象.
    實際上兩種方式實現(xiàn)機制相同,Thread類是Runnable接口的實現(xiàn)類.Runnable的實現(xiàn)類定義了線程任務,Thread類是創(chuàng)建線程的機制.

線程的狀態(tài)

  • New(新建)
    用new操作符創(chuàng)建一個新的線程時,線程未開始,在開始前做基礎工作.

  • Runnable(可運行)
    可運行其實可以分解為:就緒態(tài)和運行態(tài),就緒態(tài)意味著程序未運行,需要操作系統(tǒng)提供具體的運行時間.
    現(xiàn)在所有的桌面以及服務器操作系統(tǒng)都使用搶占式調(diào)度.

  • Blocked(阻塞)

  • Waiting(等待)

  • Timed wating(計時等待)

  • Terminated(終止)

基本方法

java.lang.Thread

  • Thread(Runnble target)
    構(gòu)造一個新線程,調(diào)用指定目標的run()方法
  • void start()
    啟動這個線程,從而調(diào)用run方法
    注意:不要調(diào)用Runnable對象或者Thread類中的run方法,直接調(diào)用run方法只會在同一個線程中執(zhí)行這個任務,而沒有啟動多線程.實際上應當調(diào)用Thread.strat方法,這會創(chuàng)建一個執(zhí)行run方法的新線程.
  • static voidf sleep(long millis)
    休眠指定的毫秒數(shù)
  • static void yield()
    使當前正在執(zhí)行的線程向另個一線程交出執(zhí)行權(轉(zhuǎn)為就緒態(tài))
  • void join()
    等待終止指定的線程(等待子線程終止,主線程才能轉(zhuǎn)為就緒)
  • setPriority();
    設置線程優(yōu)先級,10最大,1最小,默認為5
  • currentThread()
    獲取當前所執(zhí)行的Tread類
  • setName() getName()
    獲取更改線程名

代碼示例

使用sleep方法進行排序

package com.apescource.demo;
/*
 *Thread.sleep()方法示例
 */
public class Demo6 {

    public static void main(String[] args) {
        // 數(shù)字數(shù)組
        int[] numbers = { 3, 9, 4, 23, 12, 9, 14 };
        // 線程數(shù)組
        Thread[] threads = new Thread[numbers.length];
        // 線程數(shù)組與數(shù)字數(shù)組一一對應
        for (int i = 0; i < numbers.length; i++) {
            //創(chuàng)建所有的線程
            threads[i] = new Thread(new NumberThread(numbers[i]));
        }
        //線程全部進入就緒態(tài)
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
    }

}

class NumberThread implements Runnable {
    private int number;

    public NumberThread(int number) {
        this.number = number;
    }


    @Override
    public void run() {
        try {
            Thread.sleep(number*100);  
            System.out.println(number);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容