1.Thread类对象只有在调用了start()方法之后,JVM虚拟机才会给我们创建一个真正的线程!否则就不能说是创建了线程!也就是说new Thread()之后,此时实际上在计算机底层,操作系统实际上并没有为我们创建线程!
在我们new Thread();的时候,我们点击源码就可以看到:
public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); }
实际上是调用了init()方法,而且这个init()方法有几个参数,这里nextThreadNum()这个方法点进去就可以看到这是个静态方法,静 态方法只会在JVM启动的时候加载一次!
那这几个参数又是什么意思呢?我们再点击去:
private void init(ThreadGroup g, Runnable target, String name, long stackSize) { init(g, target, name, stackSize, null); }
可以看到init方法的几个参数,第一个参数是线程组,第二个参数是Runnable接口类对象,第三个参数是线程名称[从上一个init方法可以看出传递过来的名称是"Thread-数字"格式的名称],最后一个是栈的大小!然后在这个init()方法内部又调用了另一个重载的init()方法:
总结1:构造函数new Thread(); 创建线程对象Thread,默认有一个线程名,都是以Thread-开头,从0开始!形如:
Thread-0 Thread-1 Thread-2 Thread-3等! 而且这种构造方法的target会被传递为null!也就是用这个构造
方法时最终Runnable类型的target对象会被设置为null!此时再看源码就可以知道如果target被设置为null,那
么start()方法在调用start0()方法,而start0()方法在调用run()方法的时候就不会再调用Runnable实现类的run()
方法,那么此时如果不调用target对象的run方法,我们此时就要自己重写这个Thread类 的run方法了,此时
调用Thread类对象的start方法,才会执行我们自己写的run方法,如果我们自己此时也不重写Thread类的run
方法,那么什么也不会执行!
总结2:当然我们也可以使用Thread(String name)这个构造函数给线程对象起一个名子!
总结3:我们可以通过Thread(Runnable target, String name)这个构造函数在创建Thread对象的时候给Thread传递一个Runnable接口实现类对象和线程名!