每天一道Java題「10」
題目
闡述創建線程最常用的兩種方法及其對比。
解答
方法一:繼承Thread類實現
步驟:
- 創建Thread類的子類,如MyThread。
- 重寫Thread類的run方法。
- 實例化MyThread類,對象名如myThread。
- 運用Thread類的start方法啟動線程,如myThread.start。
方法二:實現Runnable介面
步驟:
- 創建一個類,如MyRunnableThread,實現Runnable介面。
- 創建MyRunnableThread類的對象。
- 實例化Thread類,對象名如thread,並向其構造函數傳入MyRunnableThread類和線程名兩個參數。
- 運用Thread類的start方法啟動線程,如thread.start。
繼承Thread類創建線程與實現Runnable介面創建線程的不同之處在於,當用同一個類創建多個線程的時候,前者實際上是創建了多個不同的Thread對象,它內部的run方法執行的時候是在各自對象中執行,互不干擾,如同多個線程執行多個任務;而後者實際上是使用同一個對象來創建多個線程,所以對象內的屬性會公用,那就相當於多個線程在執行同一個任務一樣。
另外,在使用上,繼承了Thread類的類就不能繼承其它類了,而實現了Runnable介面的類,還可以繼承其他類,前者相對局限。
這樣子說法可能有點抽象,下面那用代碼講解一下。
參考代碼
MyThread類
package me.huangzijian;
public class MyThread extends Thread {
private int num = 10;
private String name;
public MyThread(String name) {
this.name = name;
}
@Override
public void run {
int count = num;
for (int i = 0; i < count; i++) {
System.out.println(this.name + ":" + num);
num--;
}
}
}
MyRunnable類
package me.huangzijian;
public class MyRunnableThread implements Runnable {
private int num = 10;
@Override
public void run {
int count = num;
for (int i = 0; i < count; i++) {
System.out.println(Thread.currentThread.getName + ":" + num);
num--;
}
}
}
TheadCreation類
package me.huangzijian;
public class ThreadCreation {
public static void main(String[] args) {
// 繼承Thread類實現
MyThread myThread1 = new MyThread("MyThread1");
MyThread myThread2 = new MyThread("MyThread2");
MyThread myThread3 = new MyThread("MyThread3");
myThread1.start;
myThread2.start;
myThread3.start;
// 實現Runnable介面
MyRunnableThread myRunnableThread = new MyRunnableThread;
Thread t1 = new Thread(myRunnableThread, "MyRunnableThread1");
Thread t2 = new Thread(myRunnableThread, "MyRunnableThread2");
Thread t3 = new Thread(myRunnableThread, "MyRunnableThread3");
t1.start;
t2.start;
t3.start;
}
}
運行結果:
運行ThreadCreation後,我們會看到,繼承Thread類實現的結果如下:
可以看到,三個線程對於欄位num的操作是各操作各的,都將num從10減到1。
而實現Runnable介面的就誒過如下:
可以看到,三個線程對同一個myRunnableThread對象的num進行共同的操作。根據程序,每個線程循環10次,所以num從10一直減到負數。有朋友可能會問,為什麼一開始三個線程都會獲取到10,這就是線程同步的問題了,需要用到synchronized等關鍵字進行修飾。


※基於binlog來分析mysql的行記錄修改情況(python腳本分析)
※ASP.NET Core MVC 模型綁定用法及原理
※TensorFlowSharp入門使用C#編寫TensorFlow人工智慧應用
TAG:科技優家 |