Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的多线程时,run方法中的start方法的行为是什么_Java_Multithreading - Fatal编程技术网

java中的多线程时,run方法中的start方法的行为是什么

java中的多线程时,run方法中的start方法的行为是什么,java,multithreading,Java,Multithreading,当我们创建一个新线程并在run方法本身中启动它时,会发生什么?为什么在run方法内部或外部声明线程时会得到不同的行为?以下是我尝试的示例: class MyTDemo implements Runnable { // If I declare t2 here, the program ends after some time // Thread t2; public void run() { // If I declare t2

当我们创建一个新线程并在run方法本身中启动它时,会发生什么?为什么在run方法内部或外部声明线程时会得到不同的行为?以下是我尝试的示例:

   class MyTDemo implements Runnable {  
     // If I declare t2 here, the program ends after some time
     // Thread t2; 
 public void run()        
  { 
      // If I declare t2 here, the program never ends (until StackOverFlowException)
      Thread t2; 
      System.out.println("in Run");     
      t2 = new Thread(this);     
      try{        
           t2.sleep(5000);   
           t2.start();   
           System.out.println("going out "+t2.isDaemon());       
           t2.sleep(5000);        
           t2.setDaemon(true);           
        }      
      catch(Exception e){System.out.println(e.getMessage());} 
}       
    public static void main(String args[])    
{   
      MyTDemo t = new MyTDemo();     
      Thread t1,t2;    
  t1 = new Thread(t);     
      t1.start();          
      System.out.println("End");        
 }
}

您正在递归地启动线程。
MyTDemo
正在其
run()
方法中启动一个新的
MyTDemo
线程。

您正在递归启动线程。
MyTDemo
正在其
run()方法中启动一个新的
MyTDemo
线程。

  • 在一种情况下,调用
    t2.setDaemon(true)本地
    t2
    变量上执行code>。因此,始终至少有一个非守护进程线程在运行,这会阻止程序退出

  • 在另一种情况下,您可以在shared
    t2
    变量上设置守护进程状态,如果在下一个线程启动之前执行该语句,则程序可以退出,而下一个线程启动后会随机发生

您可以添加一个
System.out.println(“is daemon:+t2.isDaemon())
t2=新线程(此)以更好地了解发生了什么。

  • 在一种情况下,调用
    t2.setDaemon(true)本地
    t2
    变量上执行code>。因此,始终至少有一个非守护进程线程在运行,这会阻止程序退出

  • 在另一种情况下,您可以在shared
    t2
    变量上设置守护进程状态,如果在下一个线程启动之前执行该语句,则程序可以退出,而下一个线程启动后会随机发生


您可以添加一个
System.out.println(“is daemon:+t2.isDaemon())
t2=新线程(此)以更好地了解发生了什么。

但是当t2在run和EXTER run中声明时,行为上的差异是什么呢?它的行为改变了。这就是为什么
t2
是一个局部变量,但不能解释共享变量的行为的明显原因。如果t2是递归启动的,它是否可能以相同的标识符“t2”启动?因为据我所知,一个线程只能启动一次,但当t2在run和EXTER run中声明时,行为上的区别是什么呢?它的行为改变了。这就是为什么
t2
是一个局部变量,但不能解释共享变量的行为的明显原因。如果t2是递归启动的,它是否可能以相同的标识符“t2”启动?因为我知道一个线程一次只能启动一次all@assylias这个问题不完整。OP暗示他有不同的行为,但没有说明那是什么行为。是的,我现在明白了,@assylias。编辑以澄清。代码有点乱。请注意,“不清楚”的意思是不清楚。@assylias:这个问题不完整。OP暗示他有不同的行为,但没有说明那是什么行为。是的,我现在明白了,@assylias。编辑以澄清。代码有点乱。请注意,“不清楚”表示不清楚。