2016-08-05 115 views
2
public Demo implements Runnable(){ 
    private String threadName; 
    public Thread t; 

    public Demo(String name){ 
    this.threadName = name; 
    } 

    public void begin(){ 
     t = new Thread(this,threadName); 
     t.start(); 
    } 

    public void run(){ 
     Thread.sleep(1000); 
     System.out.println("Running"); 
    } 
} 

public static void main(String args[]) { 
    Demo demo1 = new Demo("DEMO1"); 
    demo1.begin(); 
    Demo demo2 = new Demo("DEMO2"); 
    demo2.begin(); 
} 

好的,即使在讀取API和文檔之後,我對Thread也有點困惑。我的理解是,如果你實現Runnable()或擴展Thread類,它會創建它自己的線程。公共靜態void main()創建「主線程」,然後它的孩子是2個後續線程(Demo對象),並且在調用「begin()」之後,還有另外2個線程源自Demo對象。這裏有多少個線程?

  1. 此代碼中有5個主題?
  2. Thread.sleep(1000)似乎停止所有的線程,因此它是指「主線程」?
  3. 如果我在Demo類的run()方法中調用synchronized(this),Demo1同時擁有它的監視器Demo2擁有它的監視器,同時執行它自己的任務?或者因爲他們共享一個共同的「主監視器」,他們一次執行一個,在隊列中等待。

回答

2

調用start()Thread對象啓動一個新的線程。一個普通的Runnable不會創建新線程,只有Thread對象。

此代碼中有5個主題?

有三個線程。

Thread.sleep(1000)似乎停止所有的線程。

它從兩個新線程中調用並將它們延遲一秒。

整個程序似乎停止的原因是,如果有其他活動線程(除非那些線程是daemon threads,這些不是這些線程),程序不會終止。主線程已經退出,但是您的兩個額外線程的存在將導致程序繼續運行,直到這些線程完成。

如果我打電話synchronized(this)run()方法演示類中,有demo1的擁有其顯示器在同一時間DEMO2擁有自己的顯示器,同時做自己的任務是什麼?

只有在同一個對象上進行同步時,線程纔會被阻塞。 this引用兩個不同的對象,所以線程不會互相阻塞。

1

我的理解是,如果你要麼實現Runnable()或擴展Thread類,它會創建自己的線程。

只有在明確創建線程時纔會創建線程。您在Demobegin()方法本聲明的執行過程中創建線程

t = new Thread(this,threadName); 

有5個線程的代碼?

除四個系統線程(Reference Handler,Signal Dispatcher,Attach Listener,Finalizer)外,還創建了三個應用程序線程(Main,DEMO1和DEMO2)。

Thread.sleep(1000)似乎停止所有的線程。

不。它停止調用此語句的線程。在你的情況下,它可能是DEMO1或DEMO2。

如果我在Demo類的run()方法中調用synchronized(this),Demo1同時擁有它的監視器Demo2擁有它的監視器,同時執行它自己的任務?或者因爲他們共享一個共同的「主監視器」,他們一次執行一個,在隊列中等待。

如果您在Demo類的run()方法中調用synchronized(this),則已經在您正在執行run()方法的對象上獲取monitor。在這種情況下,它可能是DEMO1或DEMO2。這兩個對象不共享監視器鎖,除非您使用className =>synchronized(Demo.Class)

請參閱此文檔page瞭解更多詳細信息。

使得這些方法同步有兩個作用:

  1. 首先,它是不可能的同一對象來交織上同步方法的兩個調用。當一個線程正在執行一個對象的同步方法時,所有其他線程調用同一對象的同步方法塊(掛起執行),直到第一個線程完成對象。其次,當一個同步方法退出時,它會自動建立一個與先前同步對象的任何後續調用同步方法的before-before關係。這保證了對所有線程都可見的對象狀態的更改。