2016-08-05 53 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关系。这保证了对所有线程都可见的对象状态的更改。