Java實現Runnable


實現Runnable 查看JDK幫助文檔

  • 定義MyRunnable類實現Runnable接口
  • 實現run()方法,編寫線程執行體
  • 創建線程對象,調用start()方法啟動線程
  • 推薦使用Runnable對象,因為Java單繼承的局限性
package com.xiao.demo01;

//創建線程方式2:實現runnable接口,重寫run方法,執行線程需要丟入runnable接口實現類。調用start方法。
public class TestThread3 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 200; i++) {
            System.out.println("我在看佐匹克---"+i);

        }

    }

    public static void main(String[] args) {
        //創建runnbale接口的實現類對象
        TestThread3 testThread3 = new TestThread3();
        //創建線程對象,通過線程對象來開戶我們的線程,代理
        //Thread thread = new Thread();

        //thread.start();

        new Thread(testThread3).start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("我在學習多張程--"+i);

        }
    }
}

小結

  • 繼承Thread類

    • 子類繼承Thread類具備多線程能力
    • 啟動線程:子類對象.start()
    • 不建議使用:避免OOP單繼承局限性
  • 實現Runnable接口

    • 實現接口Runnable具有多線程能力
    • 啟動線程:傳入目標對象+Thread對象.start()
    • 推薦使用:避免單繼承局限性,靈活方便,方便同一個對象被多個線程使用
package com.xiao.demo01;

//多個線程同時操作同一個對象
//買火車票
//發現問題:多個線程操作同一個資源的情況下,線程不安全,數據紊亂
public class TestThread4 implements  Runnable{

    //票數
    private  int ticketNums = 10;
    @Override
    public void run() {
        while (true){
            if (ticketNums<+0){
                break;
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "-->拿到了第"+ticketNums--+"票");
        }


    }

    public static void main(String[] args) {
        TestThread4 ticket = new TestThread4();

        new Thread(ticket,"小明").start();
        new Thread(ticket,"趙秋瑞").start();
        new Thread(ticket,"內鬼").start();
    }
}

繼承Thread類和實現Runnable接口的區別

分別用Thread、Runnable、Callable實現線程

龜兔賽跑

  • 首先來個賽道距離,然后要離終點越來越近
  • 判斷比賽是否結束
  • 打印出勝利都
  • 龜兔賽跑開始
  • 故事中是烏龜贏的,兔子需要睡覺,所以我們來模擬兔子睡覺
  • 終於,烏龜贏得比賽
package com.xiao.demo01;

public class Race implements Runnable {
    //勝利者
    private static String winner;
    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            //模擬兔子休息
            if (Thread.currentThread().getName().equals("兔子")&& i%10==0){
                try {
                    Thread.sleep(1);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }




            //判斷比賽是否結束
            boolean flag = gameOver(i);
            if (flag){
                break;
            }
            System.out.println(Thread.currentThread().getName() + "-->跑了" + i + "眼淚知道");
        }
    }

    //判斷是否完成比賽
    public boolean gameOver(int steps) {
        //判斷是否有勝利者
        if (winner!= null) {
            return true;
        }{
            if (steps >= 100) {
                winner = Thread.currentThread().getName();
                System.out.println("winner is"+winner);
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        Race race = new Race();

        new Thread(race,"兔子").start();
        new Thread(race,"烏龜").start();
    }

}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM