java中的多线程时,run方法中的start方法的行为是什么
当我们创建一个新线程并在run方法本身中启动它时,会发生什么?为什么在run方法内部或外部声明线程时会得到不同的行为?以下是我尝试的示例: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
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。编辑以澄清。代码有点乱。请注意,“不清楚”表示不清楚。