簡體   English   中英

我不明白Thread.sleep和'new'運算符的工作方式

[英]I don't understand how the Thread.sleep and 'new' operator work

我不清楚兩件事,一件事涉及new操作符,另一件事涉及方法Thread.sleep

// Create a second thread.
class NewThread implements Runnable {
  Thread t;

  NewThread() {
    // Create a new, second thread
    t = new Thread(this, "Demo Thread");
    System.out.println("Child thread: " + t);
    t.start(); // Start the thread
  }

  // This is the entry point for the second thread.
  public void run() {
    try {
      for(int i = 5; i > 0; i--) {
        System.out.println("Child Thread: " + i);
        Thread.sleep(500);
      }
    } catch (InterruptedException e) {
      System.out.println("Child interrupted.");
    }
    System.out.println("Exiting child thread.");
  }
}

class ThreadDemo {
  public static void main(String args[]) {
    new NewThread(); // create a new thread

    try {
      for(int i = 5; i > 0; i--) {
        System.out.println("Main Thread: " + i);
        Thread.sleep(1000);
      }
    } catch (InterruptedException e) {
      System.out.println("Main thread interrupted.");
    }
    System.out.println("Main thread exiting.");
  }

我知道new運算符用於分配一個對象,例如: Box refvar=new Box(); 在這種情況下,調用Box類的構造函數,即調用new NewThread();

但是我沒有引用變量,我不明白Java如何在沒有引用變量的情況下調用構造函數。 通常我使用:Nameofclass reference-variable-name = new NameOfConstructor();。

我不明白的另一件事是:如果沒有名稱為Thread的對象,Java如何調用Thread.sleep() 在這種情況下應該是: t.sleep(1000)還是不?

提前致謝。

您可以調用構造函數而無需為其分配引用。

在您的情況下,字段Thread t維護對該線程的引用,因此不會出現過早的垃圾回收。

Thread.sleep()休眠當前線程; 即當前正在執行該代碼位的線程。

創建一個對象( new File() )而不存儲該對象( File file = new File() )是有效的。 在這種情況下,您可以創建對象並調用構造函數,但對結果不做任何事情。 在許多情況下,這並不能做很多(但它可能會更改靜態數據或引發異常)。

在您的情況下,構造函數NewThread()實際上會創建一個線程並啟動它。

關於Thread.sleep()第二個問題實際上是在Thread類中調用靜態函數sleep ,它將等待給定的時間然后返回。 因此,這實際上將休眠當前線程,而不是您調用它的另一個線程。 請注意,即使在線程對象( someThread.sleep() )上調用它,也會使當前線程休眠,而不是someThread 在您的示例中,當前線程是主線程(由JVM創建並最終用於調用主函數)

線程#sleep始終影響當前線程。 您不允許定位其他線程以使其進入睡眠狀態。 調用t.sleep()導致調用靜態方法,該方法會影響當前線程。 在實例上調用靜態方法不是一個好主意,它可能誤導閱讀代碼的人以為代碼使另一個線程進入睡眠狀態。

您的NewThread在構造函數中創建一個線程。 一旦啟動線程,它將繼續運行直到終止為止,無論是否有其他引用。 每個線程都是GC根,可防止垃圾回收其引用的任何內容。 保留對該線程的引用將使您可以中斷它或以其他方式與其通信。

所發布的代碼似乎是由某個人創建的,該人聽說使用Runnable比擴展Thread更受青睞,但他卻錯失了為什么。 讓Runnable自己創建線程會破壞將Runnables(需要執行的任務)與執行任務(線程)的手段分開的目的。 這不是出於引起混亂的目的而設計任何實際代碼的好方法。

Thread.sleep(...)

之所以可能,是因為sleep是一種靜態方法,

根據系統計時器和調度程序的精度和准確性,使當前正在執行的線程進入休眠狀態(暫時停止執行)達指定的毫秒數。

根據JavaDoc

new NewThread();

在您的main中創建一個沒有引用的新對象,因此在創建之后,您將無法再在main中訪問該對象。 但是無論如何都會創建對象。

Thread.sleep(1000);

其次,sleep是一個靜態方法,因此您可以使用類名直接調用此方法,因此您不需要首先實例化線程的對象。

1) new ClassName()將創建一個實例。 即使以后不能引用它,也可以在該實例本身上調用實例方法。

2) Thread類具有一個稱為sleep()靜態方法,並且該靜態方法不需要實例。 可以使用className.methodName()直接調用它們

通常,線程創建2向1。擴展了Thread類2。實現Runnable接口。

在這里,您可以選擇選項2,例如Runnable Interface。

在您的代碼中

您首先用new關鍵字創建了new Thread(...) ,它是其中的可包裝Runnable對象。

答案2:

Thread.sleep()方法:暫停當前線程的執行,執行該線程時,當前線程從線程生命周期的“運行狀態”移至“等待/阻止”狀態。 completion of N-millisecond (此處為500,即0.5秒)。 該線程again wake up it and comes to Runnable state

讓我知道,如果仍然有任何疑問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM