这里有多少个线程?

时间:2016-08-05 20:29:43

标签: java multithreading

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类,它会创建自己的线程。

所以在这种情况下, Public static void main()创建“Main Thread”,然后它的子节点是2个后续线程(Demo对象),在调用“begin()”之后,还有另外2个源自Demo对象的线程。

  1. 此代码中有5个主题?
  2. Thread.sleep(1000)似乎停止了所有线程,因此它指的是“主线程”?
  3. 如果我在Demo类中的run()方法中调用synchronized(this),Demo1在拥有其监视器的同时拥有其监视器,同时执行自己的任务?或者因为他们共享一个共同的“主监视器”,他们一次执行一个,排队等候。

2 个答案:

答案 0 :(得分:2)

start()对象上调用Thread会启动一个新线程。普通Runnable不会创建新线程,只有Thread个对象可以创建。

  

此代码中有5个主题?

有三个主题。

  

Thread.sleep(1000)似乎停止了所有线程。

从两个新线程中调用它并将它们延迟一秒钟。

整个程序似乎停止的原因是如果有其他活动线程,程序不会终止(除非那些线程是daemon threads,这些线程不是)。主线程已经退出,但是你的两个额外线程的存在将导致程序继续运行,直到这些线程完成。

  

如果我在Demo类中的synchronized(this)方法中调用run(),Demo1在拥有其监视器的同时拥有其监视器,同时执行自己的任务?

线程只有在同一个对象上同步时才会阻塞。 this指的是两个不同的对象,因此线程不会相互阻塞。

答案 1 :(得分:1)

  

我的理解是,如果您实现Runnable()或扩展Thread类,它会创建自己的线程。

只有在显式创建Thread时才会创建线程。 begin()中的Demo方法在执行此语句期间创建线程

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在拥有监视器的同时拥有了它的监视器,同时执行自己的任务?或者因为他们共享一个共同的"主监视器",他们一次执行一个,排队等候。

如果在Demo类中的run()方法中调用synchronized(this),则已在运行run()方法的对象上获取了监视器。在这种情况下,它是DEMO1或DEMO2。除非您使用className =>更改此对象,否则这两个对象不共享监视器锁定synchronized(Demo.Class)

有关详细信息,请参阅此文档page

  

使这些方法同步有两个影响:

     
      
  1. 首先,对同一对象的两个同步方法的调用不可能进行交错。当一个线程正在为一个对象执行一个synchronized方法时,所有其他线程都会调用同一个对象的同步方法(暂停执行),直到第一个线程完成该对象为止。
  2.   
  3. 其次,当同步方法退出时,它会自动与同一对象的同步方法的任何后续调用建立一个先发生关系。这可以保证对所有线程都可以看到对象状态的更改。
  4.