首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 多線程入門實戰:Thread 與 Runnable 兩種方式實現賽跑邏輯

     編輯:Java 綜合教學

兩條線程搶跑:誰先跑完全程就去哪個城市旅遊

多線程是 Java 並發編程的基石。本文通過一個生動的「選擇旅遊城市」案例,對比演示繼承 Thread 類與實現 Runnable 接口兩種創建線程的寫法,並展示 sleep()、Random、getName() 等核心 API 的使用。

一、 需求描述

  • 兩個候選城市:重慶、上海。
  • 各啟動一條線程,每條線程打印 10 次城市名。
  • 每次打印後隨機休眠 0~999 毫秒。
  • 哪個線程先完成 10 次打印,就決定去該城市旅遊。

二、 方案一:繼承 Thread 類(代碼演示)

public class Ly_Thread extends Thread {
    @Override
    public void run() {
        Random r = new Random();
        for (int i = 1; i <= 10; i++) {
            try {
                int sleepMs = r.nextInt(1000); // 0-999ms
                Thread.sleep(sleepMs);
                System.out.print(sleepMs + "毫秒,去");
                System.out.println(this.getName()); // 獲取線程名
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Ly_Thread t1 = new Ly_Thread();
        t1.setName("重慶");
        t1.start(); // 啟動線程,調用 run()

        Ly_Thread t2 = new Ly_Thread();
        t2.setName("上海");
        t2.start();
    }
}

三、 方案二:實現 Runnable 接口(推薦寫法)

public class CityRunner implements Runnable {
    private String cityName;

    public CityRunner(String cityName) {
        this.cityName = cityName;
    }

    @Override
    public void run() {
        Random r = new Random();
        for (int i = 1; i <= 10; i++) {
            try {
                int sleepMs = r.nextInt(1000);
                Thread.sleep(sleepMs);
                System.out.print(sleepMs + "毫秒,去");
                System.out.println(cityName + " [線程:" + Thread.currentThread().getName() + "]");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Thread t1 = new Thread(new CityRunner("重慶"), "Thread-重慶");
        Thread t2 = new Thread(new CityRunner("上海"), "Thread-上海");
        t1.start();
        t2.start();
    }
}

四、 運行效果示例

線程交替輸出截圖

345毫秒,去重慶
12毫秒,去上海
789毫秒,去重慶
...
0毫秒,去上海  <-- 上海先跑完 10 次
決定去上海旅遊!

五、 核心知識點總結

對比項繼承 Thread實現 Runnable
實現方式class MyThread extends Threadclass MyTask implements Runnable
啟動方式new MyThread().start()new Thread(new MyTask()).start()
獲取名稱this.getName()Thread.currentThread().getName()
優勢代碼簡潔,直接訪問 Thread 方法避免單繼承限制,任務與線程分離,支持線程池、Lambda
推薦場景簡單測試、教學演示生產環境、複雜業務、線程池提交

六、 進階延伸:誰贏了?如何判斷?

當前案例僅打印日志,無「裁判」邏輯。實際開發中可引入 CountDownLatch、AtomicBoolean 或共享標誌位,在 run() 結束時檢查並設置「勝利者」,實現真正的「先到先得」業務邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved