4

我在 java 中启动线程,我想清楚地了解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());
        }
    }
}
4

3 回答 3

2

该方法t.start()和以下try/for代码在同一个线程中执行。如果您从主线程调用 Job(String) 构造函数,则这是主线程。

run()方法在新线程中执行。

于 2013-04-29T18:04:05.440 回答
2

我想清楚地了解 start()/run() 在我的情况下的作用

start()方法产生一个新的执行线程并在该线程中执行 run 方法。在这种情况下,线程将拥有自己的call stack。而run()直接调用方法不会产生新线程。相反,这将导致该run()方法在具有旧调用堆栈的当前执行线程中执行。

for 循环是 thread.t 的一部分还是主线程的一部分?

for循环将是从中产生 Thread 的一部分(如果您在主线程中创建实例,则Thread在您的情况下是线程) 。如果您想确认,则只需使用 打印执行该 for 循环的名称。例子:mainJobtthreadThread.currentThread().getName()

try{   /*<<<<<<<------------WILL THIS RUN in my MAIN thread or in the t thread??*/
    System.out.println(Thread.currentThread().getName()+" is executing this for loop");
    for(int i=0;i<5;i++){
        System.out.println("xxxThis is the count i value: "+i+" "+ t.getName());
        Thread.sleep(1000);
    }
于 2013-04-29T18:05:04.883 回答
1

for循环是thread.t主线程的一部分还是主线程的一部分?

主线。当一个线程被分叉时,新的Thread只是调用该run()方法。在您的情况下,主线程调用start()然后继续运行该for()方法。这实际上很可能在新线程完成启动之前被调用。被派生的新线程只调用该run()方法和任何其他使用的方法run()

仅供参考,从对象构造函数中启动线程被认为是非常糟糕的做法。这会在当前对象仍在初始化时“泄漏”对当前对象的引用。您应该考虑在构造函数完成后向or 调用添加一个start()方法。Jobstart()Job

 Job job = new Job(...);
 job.start();

此外,由于主线程是运行循环的线程,因此只有在主线程被中断for时才会抛出- 而不是线程。InterruptedExceptionJob

    catch(InterruptedException e){
        System.out.println("The thread has been interrupted");
    }
于 2013-04-29T18:04:40.673 回答