當前位置:
首頁 > 知識 > 每天一道Java題「10」

每天一道Java題「10」

題目

闡述創建線程最常用的兩種方法及其對比。

解答

方法一:繼承Thread類實現

步驟:

  1. 創建Thread類的子類,如MyThread。
  2. 重寫Thread類的run方法。
  3. 實例化MyThread類,對象名如myThread。
  4. 運用Thread類的start方法啟動線程,如myThread.start。

方法二:實現Runnable介面

步驟:

  1. 創建一個類,如MyRunnableThread,實現Runnable介面。
  2. 創建MyRunnableThread類的對象。
  3. 實例化Thread類,對象名如thread,並向其構造函數傳入MyRunnableThread類和線程名兩個參數。
  4. 運用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介面的就誒過如下:

每天一道Java題「10」

可以看到,三個線程對同一個myRunnableThread對象的num進行共同的操作。根據程序,每個線程循環10次,所以num從10一直減到負數。有朋友可能會問,為什麼一開始三個線程都會獲取到10,這就是線程同步的問題了,需要用到synchronized等關鍵字進行修飾。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

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

TAG:科技優家 |