我们知道java中创建线程其中的一种方法是继承Thread类,然后重写run()方法,再在主方法中调用start()执行线程 。那么我们在main中直接调用run()方法和调用start()方法的区别是什么?
我们可以观察下面的代码
public class Student1 extends Thread {
@Override
public void run(){
System.out.println("线程名:"+Thread.currentThread().getName()+"--线程id:"+Thread.currentThread().getId());
}
}
public class Student2 extends Thread {
@Override
public void run(){
System.out.println("线程名:"+Thread.currentThread().getName()+"--线程id:"+Thread.currentThread().getId());
}
}
public class ReadMain {
public static void main(String[] args){
Student1 s1 = new Student1();
s1.setName("线程1"); //为线程命名
Student2 s2 = new Student2();
s2.setName("线程2"); //为线程命名
System.out.println("主线程名:"+Thread.currentThread().getName()+"--线程id:"+Thread.currentThread().getId());
s1.start();
s1.run();
s2.start();
s2.run();
}
}
我们查看输出结果
我们知道Thread.currentThread()方法返回的是当前正在执行的线程,所以由上面的结果可以得出:
在main中调用run()方法和调用其他普通的方法一样,此时只有主线程一个线程,此时cpu被主线程占据,是在主线程中执行,currentThread()返回的是主线程main,线程名和线程id是主线程的;而调用start()方法是开始执行一个新线程,此时cpu被该线程占据,是在该线程中执行,currentThread()返回的是该线程,所以线程名和线程id就是该线程自己的了,这也就可以解释上面的输出结果了。