我正在java中启动Threads,我想清楚地了解start()
/ run()
在我的情况下的行为。
我创建了一个线程calle t,我已经放置了t.start()
,然后是for循环。
for循环是否是thread.t的一部分,还是主线程的一部分?
class Job implements Runnable{
Thread t;
Job(String tName){
t=new Thread(this, tName);
System.out.println("This is thread: "+t.getName());
t.start();
System.out.println("This is the end of constructor");
try{ /*<<<<<<<------------WILL THIS RUN in my MAIN thread or in the t thread??*/
for(int i=0;i<5;i++){
System.out.println("xxxThis is the count i value: "+i+" "+ t.getName());
Thread.sleep(1000);
}
}
catch(InterruptedException e){
System.out.println("The thread has been interrupted");
}
}
public void run(){
System.out.println("This is the start of RUN()");
try{
for(int i=0;i<5;i++){
System.out.println("This is the count i value: "+i+" "+ t.getName());
Thread.sleep(1000);
}
}
catch(InterruptedException e){
System.out.println("The thread has been interrupted");
}
finally{
System.out.println("Fnally block reached: "+t.getName());
}
}
}
答案 0 :(得分:2)
方法t.start()
和以下try/for
代码在同一个线程中执行。如果您从主线程调用Job(String)构造函数,那么这是主线程。
run()
方法在新线程中执行。
答案 1 :(得分:2)
我想清楚地知道start()/ run()在我的情况下是如何起作用的
start()
方法生成一个新的执行线程并在该线程中执行run方法。在这种情况下,线程将拥有自己的call stack
。然而,直接调用run()
方法不会产生新线程。相反,这将导致run()
方法在具有旧调用堆栈的当前执行线程中执行。
for循环是否是thread.t的一部分,还是主线程的一部分?
for
周期将成为Thread
的一部分(在您的情况下是main
线程,如果您在主线程中创建Job
实例),则线程{{1}产生了。如果你想确认,那么只需使用t
打印正在执行for循环的thread
名称。例如:
Thread.currentThread().getName()
答案 2 :(得分:1)
for循环是
thread.t
的一部分还是主线程的一部分?
主线程。分叉线程时,新Thread
只调用run()
方法。在您的情况下,主线程调用start()
,然后继续运行for()
方法。在新线程完成启动之前,这实际上很可能被称为。分叉的新线程仅调用run()
方法和run()
使用的任何其他方法。
仅供参考,从对象构造函数中启动线程被认为是非常糟糕的做法。当它仍在被初始化时,这会“泄漏”对当前对象的引用。您应该考虑在start()
上添加Job
方法,或在start()
构造函数完成后调用Job
。
Job job = new Job(...);
job.start();
此外,由于主线程是运行for
循环的主线程,因此仅当主线程被中断时才会抛出InterruptedException
- 而不是Job
线程。
catch(InterruptedException e){
System.out.println("The thread has been interrupted");
}