Java,Threads,只有run()块是线程的一部分,还是start()调用后的代码?

时间:2013-04-29 18:02:24

标签: java multithreading

我正在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());
        }
    }
}

3 个答案:

答案 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");
    }