Thread和Runnable的區別

一、Thread和Runnable區別

Java中的thread和runnable都是與線程有關的概念,它們之間有什麼區別呢?

thread是一個類,可以擴展Java類庫,它在實現線程時必須重寫run()方法。而runnable是一個接口,它只有一個run()方法需要重寫。在實現線程時,通常使用Runnable接口。

//Thread示例
class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("Thread");
    }
}

//Runnable示例
class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("Runnable");
    }
}

public class Main {
    public static void main(String[] args){
        //創建Thread對象並啟動線程
        MyThread myThread = new MyThread();
        myThread.start();

        //創建Runnable對象並啟動線程
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

二、Runnable接口

Runnable接口是一個函數式接口,它只有一個run()方法需要重寫,該方法定義了線程要執行的任務的代碼邏輯。

實現Runnable接口相對於擴展Thread類更加靈活,因為Java是單繼承的,如果擴展了Thread類那麼該類就不能再擴展其他的類了,這給程序設計帶來了極大的限制。另外,如果需要創建多個線程對象,那麼要擴展Thread類需要去創建多個Thread的子類,而實現Runnable接口只需要創建多個Runnable類的實例對象即可。

//Runnable示例
class MyRunnable implements Runnable{
    @Override
    public void run() {
        for(int i = 0; i < 5; i++){
            System.out.println(Thread.currentThread().getName() + ":" + i);
            try{
                Thread.sleep(500);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

public class Main {
    public static void main(String[] args){
        //創建Runnable對象並啟動線程1
        MyRunnable myRunnable1 = new MyRunnable();
        Thread thread1 = new Thread(myRunnable1, "Thread-1");
        thread1.start();

        //創建Runnable對象並啟動線程2
        MyRunnable myRunnable2 = new MyRunnable();
        Thread thread2 = new Thread(myRunnable2, "Thread-2");
        thread2.start();
    }
}

三、Runnable狀態

線程狀態是指一個線程在某一時刻的狀態。Java中的線程有以下六種狀態:

  1. New:新建狀態,在線程創建後還沒有啟動時處於此狀態
  2. Runnable:就緒狀態,當線程調用start()方法後處於此狀態
  3. Blocked:阻塞狀態,線程暫停執行,等待某個條件滿足後再繼續執行
  4. Waiting:等待狀態,線程等待其他線程的通知,不會自動恢復運行
  5. Timed Waiting:定時等待狀態,線程等待其他線程的通知,等待一段時間後會自動恢復運行
  6. Terminated:終止狀態,線程執行完畢或者拋出異常後處於此狀態

Runnable狀態是指線程正在執行中的狀態。

import java.util.concurrent.TimeUnit;

//Runnable示例
class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("Runnable線程開始執行。。。");
        try{
            TimeUnit.SECONDS.sleep(5);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("Runnable線程執行結束。。。");
    }
}

public class Main {
    public static void main(String[] args){
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();

        while(thread.isAlive()){
            System.out.println("線程正在執行中。。。");
            try{
                TimeUnit.SECONDS.sleep(1);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        System.out.println("線程執行完畢。。。");
    }
}

四、Thread和Runnable的選擇

一般來說,如果只是簡單的單線程程序,可以直接繼承Thread類;如果是多線程程序,或者需要繼承其他類的情況下,建議採用實現Runnable接口的方式。

Thread類在實現Runnable接口的基礎上進行了封裝,提供了更多的線程操作方法,適用於需要控制線程的詳細信息的高級應用。而Runnable接口則更為簡潔,更為靈活。

//Thread示例
class MyThread extends Thread{
    @Override
    public void run() {
        for(int i = 0; i < 5; i++){
            System.out.println(Thread.currentThread().getName() + ":" + i);
            try{
                sleep(500);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

//Runnable示例
class MyRunnable implements Runnable{
    @Override
    public void run() {
        for(int i = 0; i < 5; i++){
            System.out.println(Thread.currentThread().getName() + ":" + i);
            try{
                Thread.sleep(500);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

public class Main {
    public static void main(String[] args){
        //創建Thread對象並啟動線程
        MyThread myThread = new MyThread();
        myThread.start();

        //創建Runnable對象並啟動線程
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

五、總結

Java中的thread和runnable都是與線程有關的概念,其中thread是一個類,可以擴展Java類庫,它在實現線程時必須重寫run()方法;而runnable是一個接口,它只有一個run()方法需要重寫。在實現線程時,通常使用Runnable接口。

Runnable接口相對於擴展Thread類更加靈活,因為Java是單繼承的,如果擴展了Thread類那麼該類就不能再擴展其他的類了,這給程序設計帶來了極大的限制。另外,如果需要創建多個線程對象,那麼要擴展Thread類需要去創建多個Thread的子類,而實現Runnable接口只需要創建多個Runnable類的實例對象即可。

線程的狀態包括新建狀態、就緒狀態、阻塞狀態、等待狀態、定時等待狀態和終止狀態。Runnable狀態指線程正在執行中的狀態。

使用Thread類,則需要在類中直接實現run()方法;使用Runnable接口,需要在類中實現run()方法,並且需要創建一個Thread對象,將實現了Runnable接口的類傳遞給Thread對象的構造方法,並且調用start()方法啟動線程。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/196042.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-03 09:52
下一篇 2024-12-03 09:52

相關推薦

  • Python中new和init的區別

    new和init都是Python中常用的魔法方法,它們分別負責對象的創建和初始化,本文將從多個角度詳細闡述它們的區別。 一、創建對象 new方法是用來創建一個對象的,它是一個類級別…

    編程 2025-04-29
  • Sublime Test與Python的區別

    Sublime Text是一款流行的文本編輯器,而Python是一種廣泛使用的編程語言。雖然Sublime Text可以用於編寫Python代碼,但它們之間有很多不同之處。接下來從…

    編程 2025-04-29
  • Shell腳本與Python腳本的區別

    本文將從多個方面對Shell腳本與Python腳本的區別做詳細的闡述。 一、語法差異 Shell腳本和Python腳本的語法存在明顯差異。 Shell腳本是一種基於字符命令行的語言…

    編程 2025-04-29
  • Java Thread.start() 執行幾次的相關問題

    Java多線程編程作為Java開發中的重要內容,自然會有很多相關問題。在本篇文章中,我們將以Java Thread.start() 執行幾次為中心,為您介紹這方面的問題及其解決方案…

    編程 2025-04-29
  • Python中while語句和for語句的區別

    while語句和for語句是Python中兩種常見的循環語句,它們都可以用於重複執行一段代碼。然而,它們的語法和適用場景有所不同。本文將從多個方面詳細闡述Python中while語…

    編程 2025-04-29
  • Web程序和桌面程序的區別

    Web程序和桌面程序都是進行軟件開發的方式,但是它們之間存在很大的區別。本文將從多角度進行闡述。 一、運行方式 Web程序運行於互聯網上,用戶可以通過使用瀏覽器來訪問它。而桌面程序…

    編程 2025-04-29
  • TensorFlow和Python的區別

    TensorFlow和Python是現如今最受歡迎的機器學習平台和編程語言。雖然兩者都處於機器學習領域的主流陣營,但它們有很多區別。本文將從多個方面對TensorFlow和Pyth…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • 麥語言與Python的區別

    麥語言和Python都是非常受歡迎的編程語言。它們各自有自己的優缺點和適合的應用場景。本文將從語言特性、語法、生態系統等多個方面,對麥語言和Python進行詳細比較和闡述。 一、語…

    編程 2025-04-28
  • Python與C語言的區別和聯繫

    Python與C語言是兩種常用的編程語言,雖然兩者都可以用於編寫軟件程序,但是它們之間有很多不同之處。本文將從多個方面對Python與C語言的區別和聯繫進行詳細的闡述。 一、語法特…

    編程 2025-04-28

發表回復

登錄後才能評論