1.从类型上来讲run方法是非同步方法,而star方法是同步方法
2.从作用上来讲run方法的作用是存放任务代码的,start的方法的作用是启动线程,线程启动以后它 会自动去执行run方法
3.从线程数量上来讲run方法在执行过程中不会产生新的线程,而start方法在执行过程中会产生一 个新线程。
4.从方法调用多次会不会出问题,run方法可以被调用,无数次都不会产生问题,而start方法虽然 说它可以被调用无数次 , 但是在于线程只能被启动一次 , 它不能重复启动 !
事实上那个run()方法与start()是八竿子打不着的 !
代码展示
class MyThread5 extends Thread{
@Override
public void run() {
System.out.println("run方法!");
}
}
public class ThreadDemo7 {
public static void main(String[] args) {
Thread thread = new MyThread5();
thread.run();
}
}
class MyThread5 extends Thread{
@Override
public void run() {
System.out.println("run方法!");
}
}
public class ThreadDemo7 {
public static void main(String[] args) {
Thread thread = new MyThread5();
thread.start();
}
}
二个代码运行结果
结果一样但是具体内部还是有很大的区别的!
1.run()方法只是单纯的调用run方法内部的代码 , 并非没有实际的创建线程!
2.start()方法就是创建了线程然后调用了run()方法!
接下来代码就会很好解释这个原因了!
代码展示1
class MyThread5 extends Thread{
@Override
public void run() {
while (true){
System.out.println("run方法!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadDemo7 {
public static void main(String[] args) {
Thread thread = new MyThread5();
thread.run();
while (true){
System.out.println("第二个线程!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果
运行全是run()方法内部的while()循环代码段,而main方法里面的while就没有运行,这是因为没有创建线程,只有main这一个线程,所以导致一直运行run()中的while循环!
代码展示2
class MyThread5 extends Thread{
@Override
public void run() {
while (true){
System.out.println("run方法!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadDemo7 {
public static void main(String[] args) {
Thread thread = new MyThread5();
thread.start();
while (true){
System.out.println("第二个线程!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果
这里就是正常了,由于start方法创建了线程,从而可以实现main与Thread中的二个while都可以实现运行,这里就可以很好的解释了run与start的不同之处!