實現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();
}
}