簡體   English   中英

Java線程:請闡明這種理解

[英]Java Thread: Please clarify this understanding

public class Qn {

    static class Friend {
        private final String name;

        public Friend(String name) {
            this.name = name;
        }

        public String getName() {
            return this.name;
        }

        // recipient - the person who greets
        public synchronized void sayHi(Friend recipient) {
            System.out.format("%s" + " said hi to %s %n",
                      this.name, recipient.getName());
        }
    }

    public static void main(String[] args) {
        final Friend john = new Friend("John");
        final Friend peter = new Friend("Peter");

        new Thread(new Runnable() {
            public void run() {
                john.sayHi(peter);
            }
        }, "thread1").start();
    }
}

問題:

如果理解正確,請說明以下內容

  1. 當調用john.sayHi()線程thread1已獲得的內部鎖john對象按順序訪問sayHi()的方法john對象。

  2. 線程thread1在JVM中獨立運行。

我在網上閱讀了這些聲明,不確定它們的含義! [線程如何在對象上運行!!! Infact線程執行代碼,對嗎?]

  1. 線程thread1不在JVM內部的任何其他對象上運行。

  2. 線程永遠不會在任何對象上運行。 線程永遠不會由對象執行。 一個線程永遠不會在任何其他線程上運行。 線程總是直接在JVM中運行。

  1. 幾乎。 我將“已獲得”替換為“將嘗試獲得”。
  2. 不知道 請解釋“獨立運行”的含義。
  3. 與2相同,但我會嘗試猜測-不,線程不綁定到任何對象,除了相關的Thread對象。
  4. 同樣,如果我對您的理解正確-除關於Thread對象的說明外,所有部分的答案都是肯定的。

調用john.sayHi() ,線程thread1已獲取john對象的固有鎖定,以便訪問john對象的sayHi()方法。

更確切地說:

當調用john.sayHi() ,線程thread1將等待直到可以獲取對john的鎖,然后再執行sayHi 一旦獲得了鎖,它將執行sayHi 方法退出時,它將釋放鎖定。

線程thread1在JVM中獨立運行。

獨立於什么? 其他線程? 是的,直到嘗試獲取鎖為止。 到那時,其他線程可能會阻止它。 當它具有鎖時,它可以阻止其他線程。

線程thread1不在JVM內部的任何其他對象上運行。

線程運行在CPU上,而不是對象上。

您是在問一個線程是否可以並行執行多個方法? 如果是這樣,答案是否定的。

線程永遠不會在任何對象上運行。

線程運行在CPU上,而不是對象上。

線程永遠不會由對象執行。

線程不執行任何操作。 線程執行代碼。

一個線程永遠不會在任何其他線程上運行。

線程在CPU上運行,而不是線程。

線程總是直接在JVM中運行。

JVM具有運行線程的虛擬CPU。

  1. 在獲得鎖之前 ,它將不會運行。
  2. 它是與主線程分離的獨立執行線程,因此在不受束縛的意義上是“獨立的”。
  3. 線程由堆棧和指令指針表示。 有一個Thread對象,該線程不是“在其上運行”。 該對象只是它的“保持狀態”。
  4. 真正。

見下文

調用john.sayHi()時,線程thread1已獲取john對象的固有鎖定,以便訪問john對象的sayHi()方法。

Ans->任何線程,如果它必須執行任何同步方法,那么它將獲得鎖。 對象鎖還是類鎖? 根據靜態或非靜態同步方法確定。 如果它是靜態的,則采用類鎖;如果非靜態的,則采用對象鎖。

線程thread1在JVM中獨立運行。

回答->如果線程不是守護進程,則它將獨立運行。 但是,如果線程是守護程序,則它依賴於其父線程,如果父線程去世,它將也被終止。

線程thread1不在JVM內部的任何其他對象上運行。

Ans->線程將不會在任何對象上運行,實際上沒有代碼在任何對象上運行。 畢竟所有對象都擁有執行狀態。

線程永遠不會在任何對象上運行。 線程永遠不會由對象執行。 一個線程永遠不會在任何其他線程上運行。 線程總是直接在JVM中運行。

Ans -> 100% true statement

讓我知道其他任何疑問

暫無
暫無

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

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