关于在Thread类中调用start()方法的一些问题

时间:2015-01-01 06:59:13

标签: java multithreading concurrency

我是并发领域的初学者,今天我在join()方法中做了一些练习。 代码是:

public class ThreadJoinExample {
public static void main(String[] args) {
    Thread t1 = new Thread(new MyRunnable(), "t1");
    Thread t2 = new Thread(new MyRunnable(), "t2");
    Thread t3 = new Thread(new MyRunnable(), "t3");
    t1.start();
    try {
        t1.join(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    t2.start();
    try {
        t1.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    t3.start();
    try {
        t1.join();
        t2.join();
        t3.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}


class MyRunnable implements Runnable {

@Override
public void run() {
    System.out.println("Thread started:::"
            + Thread.currentThread().getName());
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out
            .println("Thread ended:::" + Thread.currentThread().getName());
}

和questinon,例如,当" t1.start()",我认为t1将立即调用run()方法,但它不是真的;当" t1时。 join()",t1将调用run()方法, 我不知道造成它的原因。我的问题是: 1.当我调用start()方法时会发生什么? 2.当线程t调用start()方法时,线程t是否会被推入主memroy中的就绪队列?

2 个答案:

答案 0 :(得分:1)

1。当我调用start()方法时会发生什么?

当你调用start方法时,它就准备好执行你的线程了。它可能是也可能不是立即的,并且取决于调度程序何时调度您的线程,然后jvm将运行您的run方法。

<强> 2。当线程t调用start()方法时,线程t是否会被推入主存储器中的就绪队列?

是的,这是对的。它可能会也可能不会立即开始执行您的线程。你可以尝试使用main方法启动你的线程,你的主线程可能会在你的线程尚未开始时完成执行。

答案 1 :(得分:1)

  
      
  1. 当我调用start()方法时会发生什么?
  2.   

调用start()告诉线程创建必要的系统 资源然后异步执行run()方法。

  
      
  1. 当线程t调用start()方法时,线程t是否会被推入主内存中的就绪队列?
  2.   

是。 start()方法告诉Java虚拟机它需要它 创建系统特定的线程。创建系统后 资源,它将Runnable对象传递给它以执行其run() 方法