区别
- run()方法实际还是在主线程中执行,没有实现多线程的特性,因此它是同步执行的。
- start()方法是主线程开了一个新的线程,它实现了多线程的特征,因此他是交替执行的。
举例说明
1) 线程.run()方法
public class MyThreadTask extends Thread {
private int count = 5;
@Override
public void run() {
while(count-- >0)
{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程名" + this.getName() + ",次数(" + count + ")");
}
}
public static void main(String[] args) {
MyThreadTask task = new MyThreadTask();
task.run();//顺序执行
System.out.println("start 测试");
}
}
输出:
线程名Thread-0,次数(4)
线程名Thread-0,次数(3)
线程名Thread-0,次数(2)
线程名Thread-0,次数(1)
线程名Thread-0,次数(0)
start 测试
线程名Thread-0,次数(3)
线程名Thread-0,次数(2)
线程名Thread-0,次数(1)
线程名Thread-0,次数(0)
start 测试
通过结果我们可以看到使用run方法它是顺序执行的,先执行了线程MyThreadTask 类的对象task然后再执行主线程,因此它并没有实现多线程的特性。
2) 线程.start()方法
我们把run改成start()方法
public class MyThreadTask extends Thread {
private int count = 5;
@Override
public void run() {
while(count-- >0)
{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程名" + this.getName() + ",次数(" + count + ")");
}
}
public static void main(String[] args) {
MyThreadTask task = new MyThreadTask();
task.start();
System.out.println("start 测试");
}
}
会看到不一样的结果start 测试
线程名Thread-0,次数(4)
线程名Thread-0,次数(3)
线程名Thread-0,次数(2)
线程名Thread-0,次数(1)
线程名Thread-0,次数(0)
线程名Thread-0,次数(4)
线程名Thread-0,次数(3)
线程名Thread-0,次数(2)
线程名Thread-0,次数(1)
线程名Thread-0,次数(0)
通过结果我们可以看到使用start方法它不是顺序执行的,而是交错执行的,它实现了多线程的特征。